C# 意外的跨线程异常

C# 意外的跨线程异常,c#,winforms,C#,Winforms,下面的方法是从UserControl的构造函数启动的。引发了跨线程异常,但我不知道原因: public override void Populate() { base.Populate (); LoadEditableList(IEditableList); ThreadStart fix = null; fix = delegate() { if (InvokeRequired) { Invoke(fix); } else {

下面的方法是从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();
 }

ButtonAd_Click方法将项目添加到ListView。奇怪的是,如果我在
if(invokererequired)
行中添加断点,我就避免了这个错误。这与我已经写了几十次的模式非常相似,我怀疑由于新婴儿无睡眠综合症,我遗漏了一些东西。

我相信
invokererequired
在构建windows句柄之前不会返回适当的值。在你的构造器中,它在哪里被调用

仅用于测试,如果调用Control。首先处理,如下所示:

IntPtr handle = Handle;
Populate
方法的顶部,这有帮助吗?我并不是说这是一个永久性的修复,但如果你闯入调试器,它将继续工作-它将访问
句柄
属性来显示它,这将强制创建句柄


与负责其父窗口的线程相比,此构造函数运行在哪个线程上?特定窗口中的所有控件都应使用相同的UI线程。

您可能遇到了已知问题,请参阅,有关详细信息,请参阅和。

我认为您是正确的。通过将populate方法绑定到VisibleChanged事件,我解决了这个问题。谢谢