我有一个应用程序有两组不同的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.