C# c与UserControls的交叉线程错误

C# c与UserControls的交叉线程错误,c#,.net,winforms,user-controls,multithreading,C#,.net,Winforms,User Controls,Multithreading,以下是我的情况: 我在一个主线程上实例化了一个c usercontrol,但它没有添加到表单中 //global declaration usercontrol1 datacontrol; constructor() { ....... datacontrol = new usercontrol1(); ........ } 然后我有一个asyhcnronous后台线程,它触发一个由实例化的datacontrol处理的事件。事件处理程序有一个: if(InvokeRequired

以下是我的情况:

我在一个主线程上实例化了一个c usercontrol,但它没有添加到表单中

//global declaration
usercontrol1 datacontrol;

 constructor()
{
.......
     datacontrol = new usercontrol1();
........
}
然后我有一个asyhcnronous后台线程,它触发一个由实例化的datacontrol处理的事件。事件处理程序有一个:

if(InvokeRequired){BeginInvoke(..);}
这将防止进行任何跨线程调用。但是,当调用该函数时,InvokeRequired为false,因此不会在正确的线程上调用处理程序。因此,在处理程序中,当我尝试this.labelname.text=blah时,会引发一个跨线程异常

但是,如果我将控件添加到mainform上的面板,并将其删除,则允许后台线程触发事件。处理程序输入,但这次“InvokeRequired”设置为true,因此它在mainthreads上下文中正确地调用自己,以避免异常

有人能给我解释一下为什么将其添加到面板中,然后将其删除可以修复错误吗

表单没有onLoad事件,因此应该在不绘制表单的情况下正确实例化所有内容

谢谢!
stephanie

当您向父控件或窗体添加控件或窗体时,它将设置WindowHandles的创建。显然,还需要初始化invokererequired逻辑的执行上下文


因此,不要假设创建但从未显示的控件或窗体的行为“正常”

向父控件或窗体添加控件或窗体时,会设置WindowHandles的创建。显然,还需要初始化invokererequired逻辑的执行上下文


因此,不要假设创建但从未显示的控件或窗体的行为“正常”

这可能是因为尚未创建控件的句柄。如果在构造函数中引用dataform.Handle,它应该创建句柄并适当地设置线程ID,因此InvokeRequired稍后将返回true


您还可以使用强制创建句柄,但仅当控件可见时。这可能是因为尚未创建控件的句柄。如果在构造函数中引用dataform.Handle,它应该创建句柄并适当地设置线程ID,因此InvokeRequired稍后将返回true


您也可以使用强制创建句柄,但仅当控件可见时。

将控件添加到面板=将数据表单添加到面板?我的示例命名是poorchoice,它是usercontrol而不是winform。更新了示例add the control to a panel=将数据表单添加到面板?我的示例命名是poorchoice,它是usercontrol而不是winform。更新了示例。createHandle的选项未显示在my usercontrol中。IsHAndleCreated确实如此though@Without抱歉,CreateHandle受保护。您可以在控件类中访问它。用另一个替代解决方案更新了答案。不过,只要访问Handle属性就可以完成您想要的操作。这很有效!!非常感谢你。我被这弄糊涂了!!只是为了分享我所做的。我加了一个!datacontrol.IsHandleCreated datacontrol.CreateControl在控件的初始声明之后。这似乎已经解决了它。再次感谢!.createHandle的选项未显示在my usercontrol中。IsHAndleCreated确实如此though@Without抱歉,CreateHandle受保护。您可以在控件类中访问它。用另一个替代解决方案更新了答案。不过,只要访问Handle属性就可以完成您想要的操作。这很有效!!非常感谢你。我被这弄糊涂了!!只是为了分享我所做的。我加了一个!datacontrol.IsHandleCreated datacontrol.CreateControl在控件的初始声明之后。这似乎已经解决了它。再次感谢!那么你认为没有办法显示控件?那么你认为没有办法显示控件?