代码之家  ›  专栏  ›  技术社区  ›  Jake Pearson

意外的跨线程异常

  •  1
  • Jake Pearson  · 技术社区  · 15 年前

    以下方法是从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 回复  |  直到 15 年前
        1
  •  2
  •   Jon Skeet    15 年前

    我相信 InvokeRequired 在构造Windows句柄之前不会返回适当的值。您的构造函数中的位置是否正在调用?

    仅用于测试,如果调用control.handle优先,如下所示:

    IntPtr handle = Handle;
    

    在你的顶端 Populate 方法,有帮助吗?我并不是建议将其作为一个永久性的修复,但是如果您闯入调试程序,它将与它联系起来工作-它将访问 Handle 属性来显示它,这将强制创建句柄…

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

        2
  •  1
  •   Matt Warren    15 年前

    你可能会遇到一个已知的问题,看 here , here here 更多信息。