c# – 在一个线程中有一组win表单而在另一个线程中有另一个组有问题吗?

我有一个应用程序有两组不同的win表单,我希望每个组在不同的线程中运行.只要我在不同线程上发生操作时我是BeginInvoke / Invoke,这种方法是否有任何问题?

这个问题源于这样一个事实:我一直习惯于用’gui线程’来思考,如果(InvokeRequired){Invoke} else {…}并且所有表单都存在于该线程上.

这个问题的另一个角度:

关于win表单存在的默认线程是否存在“特殊”或与其他任何线程相同?

最佳答案 好吧,有一些方法可以射击脚,但
Windows Forms很少忘记告诉你它.

是的,“主线”有一些特别之处.它运行在STA模式,一个单线程公寓.它是一种影响COM组件的模式,像OpenFileDialog这样的shell对话框以及Drag Drop和Clipboard等操作.显示UI的线程始终必须是STA.这在Main()方法的[STAThread]属性的普通WF应用程序中是自动的.在您自己的应用程序中,您必须在启动之前调用Thread.SetApartmentState().并且线程是特殊的,因为它抽取消息循环(Application.Run),这是STA线程的要求.

默认情况下,您启动的任何线程或任何线程池线程都以MTA模式运行.线程池线程无法更改,它们始终是MTA.

点赞