从UserControl的构造函数启动以下方法。抛出了一个跨线程异常,但我不明白为什么:
public override void Populate()
{
base.Populate ();
LoadEditableList(IEditableList);
ThreadStart fix = null;
fix = delegate()
{
if (InvokeRequired)
{
Invoke(fix);
}
else
{
buttonAdd_Click(null, null);
}
};
var thread = new Thread(fix);
thread.Start();
}
buttonAdd_Click方法将项添加到ListView。奇怪的是,如果我向if (InvokeRequired)
行添加一个断点,我就避免了这个错误。这非常类似于我写过几十次的模式,我怀疑我因为新生儿没有睡眠综合症而遗失了什么。
答案 0 :(得分:2)
我相信InvokeRequired
在构建Windows句柄之前不会返回适当的值。您的构造函数中的行踪是否被称为?
只是为了测试,如果你先调用Control.Handle,就像这样:
IntPtr handle = Handle;
位于Populate
方法的顶部,这有帮助吗?我并不是说这是一个永久性的修复,但如果你闯入调试器就会保持工作 - 它将访问Handle
属性来显示它,这将强制句柄为创建...
与负责其父窗口的线程相比,此构造函数运行的是什么线程?特定窗口中的所有控件都应使用相同的UI线程。
答案 1 :(得分:1)