5

私はマルチスレッドアプリケーションが本当に苦手なようです。を開こうとしていますが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に設定できない原因は何ですか?

4

1 に答える 1

14

スレッドを開始する前に、 SetApartmentState()を呼び出す必要があります。COMは、スレッドがマネージコードの実行を開始する前に、CLRによって初期化されます。また、BackgroundWorkerを含むスレッドプールスレッドではこれを実行できないことにも注意してください。

一般に、複数のスレッドでウィンドウを使用することはお勧めできません。スレッドのウィンドウは、メインUIスレッドのウィンドウとZオーダーの関係はありません。これは、非常に厄介なユーザビリティの問題を引き起こす可能性があります。メインウィンドウの後ろに隠れているこのダイアログのように。タスクバーボタンもありません。ユーザーはそれを見つけることができません。

これを行わないでください。ダイアログが他のウィンドウに対してモーダルになるように、Control.Invoke()を使用してください。または、より一般的には、UI以外のタスクにのみワーカースレッドを使用します。

于 2011-08-02T21:18:28.357 に答える