C# 意外的跨线程异常
下面的方法是从UserControl的构造函数启动的。引发了跨线程异常,但我不知道原因:C# 意外的跨线程异常,c#,winforms,C#,Winforms,下面的方法是从UserControl的构造函数启动的。引发了跨线程异常,但我不知道原因: public override void Populate() { base.Populate (); LoadEditableList(IEditableList); ThreadStart fix = null; fix = delegate() { if (InvokeRequired) { Invoke(fix); } else {
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();
}
ButtonAd_Click方法将项目添加到ListView。奇怪的是,如果我在
if(invokererequired)
行中添加断点,我就避免了这个错误。这与我已经写了几十次的模式非常相似,我怀疑由于新婴儿无睡眠综合症,我遗漏了一些东西。我相信invokererequired
在构建windows句柄之前不会返回适当的值。在你的构造器中,它在哪里被调用
仅用于测试,如果调用Control。首先处理,如下所示:
IntPtr handle = Handle;
在Populate
方法的顶部,这有帮助吗?我并不是说这是一个永久性的修复,但如果你闯入调试器,它将继续工作-它将访问句柄
属性来显示它,这将强制创建句柄
与负责其父窗口的线程相比,此构造函数运行在哪个线程上?特定窗口中的所有控件都应使用相同的UI线程。您可能遇到了已知问题,请参阅,有关详细信息,请参阅和。我认为您是正确的。通过将populate方法绑定到VisibleChanged事件,我解决了这个问题。谢谢