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

标签 c# multithreading

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

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

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

wired worker threads

欢迎任何建议!

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

有人知道导致屏幕截图中所示的线程命名模式的原因吗?

最佳答案

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

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

关于c# - 在不同线程中创建的控件.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13625546/

相关文章:

c# - 有没有办法在 Visual Studio 调试器中查看对象的变量而不查看所有基类内容

multithreading - Python中的多线程异步

spring - 我无法以任何方式从 Spring Boot 中的 application.properties 获取值(value)

c# - 如何传递 'null' 操作

c# - Entity Framework : Attach Disconnected Entity Throws Exception

c# - 两个 DateTimes 之间的时差?

c# - 将文件从客户端发送到服务器

Python线程不会同时运行

.NET:如何在特定线程上调用委托(delegate)? (ISynchronizeInvoke、Dispatcher、AsyncOperation、SynchronizationContext 等)

multithreading - pthread_once() 是如何在内部实现的?