无法设置指定的COM单元状态

时间:2011-08-02 18:58:27

标签: c# multithreading folderbrowserdialog

我似乎对多线程应用程序不太满意。我正试图打开一个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?

1 个答案:

答案 0 :(得分:11)

您必须在启动线程之前调用SetApartmentState()。在任何线程开始运行任何托管代码之前,CL由CLR初始化。另请注意,您无法在线程池线程上执行此操作,包括BackgroundWorker。

在多个线程上使用Windows通常是一个坏主意。线程上的窗口与主UI线程上的窗口没有Z顺序关系。这可能会导致非常棘手的可用性问题。就像隐藏在主窗口后面的对话框一样。也没有任务栏按钮,用户永远不会找到它。

不要这样做,使用Control.Invoke()使对话框对其他窗口是模态的。或者更常见的是,仅将工作线程用于非UI任务。