2

我目前正在调试我们的 .NET 应用程序中的有线问题。我们将表单和控件动态地插入在一起,作为对某些服务器事件的反应。与服务器的通信当然是在线程中完成的。所有 UI 元素都通过 Control 的调用机制进行操作。

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

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

有线工作线程

欢迎任何建议!

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

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

4

1 回答 1

3

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

您可以通过检查 Control.IsHandleCreated 来检查这一点,因此您至少可以查明这是否正在发生。但是,如果确实发生了这种情况,则修复它是另一回事……

于 2012-11-29T12:39:01.340 回答