【发布时间】:2010-08-27 03:45:45
【问题描述】:
这是我的情况:
我在主线程上实例化了一个 c# 用户控件,但它没有添加到表单中。
//global declaration
usercontrol1 datacontrol;
constructor()
{
.......
datacontrol = new usercontrol1();
........
}
然后我有一个异步后台线程,它触发由实例化数据控件处理的事件。事件处理程序有一个:
if(InvokeRequired){BeginInvoke(..);}
这应该可以防止进行任何跨线程调用。但是,当它被调用时,InvokeRequired 为 false,因此不会在正确的线程上调用处理程序。所以在处理程序中,当我尝试 this.labelname.text ="blah" 时,会引发跨线程异常。
但是,如果我将控件添加到主窗体上的面板并将其删除,则允许后台线程触发事件。处理程序进入,但这次 'InvokeRequired' 设置为 true,因此它在主线程上下文中正确调用自身,避免异常。
有人可以向我解释为什么将其添加到面板然后删除它会修复错误吗?
表单没有 onLoad 事件,因此所有内容都应该在不被绘制的情况下正确实例化。
谢谢! 斯蒂芬妮
【问题讨论】:
-
"将控件添加到面板" = "将数据表单添加到面板?
-
我的示例命名是一个糟糕的选择,它是一个用户控件而不是一个 winform。更新了示例
标签: c# .net winforms user-controls multithreading