意外的交叉线程异常

时间:2009-10-30 17:16:33

标签: c# winforms

从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)行添加一个断点,我就避免了这个错误。这非常类似于我写过几十次的模式,我怀疑我因为新生儿没有睡眠综合症而遗失了什么。

2 个答案:

答案 0 :(得分:2)

我相信InvokeRequired在构建Windows句柄之前不会返回适当的值。您的构造函数中的行踪是否被称为?

只是为了测试,如果你先调用Control.Handle,就像这样:

IntPtr handle = Handle;

位于Populate方法的顶部,这有帮助吗?我并不是说这是一个永久性的修复,但如果你闯入调试器就会保持工作 - 它将访问Handle属性来显示它,这将强制句柄为创建...

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

答案 1 :(得分:1)

您可能遇到了已知问题,请参阅hereherehere了解详情。