在不同的线程.NET中创建的控件

时间:2012-11-29 12:10:39

标签: c# multithreading

我正在调试.NET应用程序中的有线问题。我们将Forms和Controls动态插件作为对某些服务器事件的反应。当然,与服务器的通信是在线程中完成的。所有UI元素都通过Control的Invoke Mechanism进行操作。

我仍然可以获得跨线程异常。在某些子控件中,InvokeRequired属性为true,尽管其父级的InvokeRequired属性为false。所以这些孩子必须在主线之外创建。我正在寻找可能导致这个错误的Control创建的线程。正如您在Visual Studio的线程视图的屏幕截图中看到的那样,有很多名为“mainX”的工作线程(这些只是其中的一部分),我不知道它们来自哪里。

这是“旧”主线程的某种标准命名模式吗?也许是由于 - 我不知道 - 多次调用Application.Run或类似的东西?

wired worker threads

欢迎任何建议!

编辑(总结)
我有一个带有InvokeRequired == false的根控件和一些带有InvokeRequired == true的子控件。这怎么可能呢? root.Controls.Add(child)应该已经抛出异常。

是否有人知道导致线程命名模式的原因,如屏幕截图所示?

1 个答案:

答案 0 :(得分:2)

我认为可能发生的事情是你在控件创建其句柄之前以某种方式检查Control的InvokeRequired属性。如果你这样做,InvokeRequired将返回false,即使它是一个单独的线程。

你可以通过检查Control.IsHandleCreated来检查这一点,这样你至少可以知道这是不是正在发生的事情。修复它,如果确实发生的事情是其他的东西,但是......