5

看来我真的不擅长多线程应用程序。我正在尝试打开一个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);

但这给了例外Failed to set the specified COM apartment state

我有一个临时修复程序,可以在 STA 模式下创建一个新线程并打开FolderBrowserDialog,但我想要一个更整洁的解决方案。是什么导致无法将公寓状态设置为 STA?

4

1 回答 1

14

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

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

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

于 2011-08-02T21:18:28.357 回答