【问题标题】:Are there any problems with having a group of win forms in one thread and another group in another thread?在一个线程中拥有一组获胜表格而在另一个线程中拥有另一组是否有任何问题?
【发布时间】:2010-01-29 11:00:13
【问题描述】:
我有一个应用程序,它有两组不同的 win 表单,我希望每个组在单独的线程中运行。只要我在跨不同线程发生操作时 BeginInvoke/Invoke,这种方法有什么问题吗?
这个问题源于这样一个事实,即我一直习惯于用“gui 线程”来思考,我必须 if (InvokeRequired) { Invoke } else { ... } 并且所有表单都存在于该线程上。
这个问题的另一个角度:
win 表单存在的默认线程有什么“特殊”吗?或者它与任何其他线程相同?
【问题讨论】:
标签:
c#
user-interface
multithreading
【解决方案1】:
好吧,有很多方法可以射脚,但 Windows 窗体很少忘记告诉你这件事。
是的,“主线程”有一些特别之处。它以单线程单元 STA 模式运行。它是一种影响 COM 组件、OpenFileDialog 等外壳对话框以及拖放和剪贴板等操作的模式。显示 UI 的线程必须始终是 STA。这在 Main() 方法上具有 [STAThread] 属性的普通 WF 应用程序中是自动的。在您自己的应用程序中,您必须在启动之前调用 Thread.SetApartmentState()。而且线程很特别,因为它会泵送一个消息循环(Application.Run),这是 STA 线程的要求。
默认情况下,您启动的任何线程或任何线程池线程都以 MTA 模式运行。线程池线程无法更改,它们始终是 MTA。
【解决方案2】:
它应该工作得很好,我很确定在我当前的项目中它是这样实现的,我们没有看到任何问题。您只需要记住在使用 InvokeRequired 和 Invoke 方法时使用正确的控件。
GUI 线程只是简单地泵送消息,以便它可以处理标准的 Windows 消息,我认为它没有什么特别之处。