Dan*_*iel 4 c# multithreading folderbrowserdialog
看来我对多线程应用程序真的不太好.我试图打开一个FolderBrowserDialog,但我得到一个例外告诉我:
Current thread must be set to single thread apartment (STA) mode before OLE calls can be made.
我已经STAThreadAttribute在我的Main方法中设置了,但是从我的主线程以外的线程调用FolderBrowserDialog.我试过了
Thread.CurrentThread.SetApartmentState(ApartmentState.STA);
Run Code Online (Sandbox Code Playgroud)
但这给了例外Failed to set the specified COM apartment state.
我有一个临时修复,在STA模式下创建一个新线程并打开FolderBrowserDialog,但我想有一个更整洁的解决方案.是什么原因导致无法将公寓状态设置为STA?
Han*_*ant 11
您必须在启动线程之前调用SetApartmentState().在任何线程开始运行任何托管代码之前,CL由CLR初始化.另请注意,您无法在线程池线程上执行此操作,包括BackgroundWorker.
在多个线程上使用Windows通常是一个坏主意.线程上的窗口与主UI线程上的窗口没有Z顺序关系.这可能会导致非常棘手的可用性问题.就像隐藏在主窗口后面的对话框一样.也没有任务栏按钮,用户永远不会找到它.
不要这样做,使用Control.Invoke()使对话框是其他窗口的模态.或者更一般地,仅将工作线程用于非UI任务.