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