2011-08-02 22 views
3

私はマルチスレッドアプリケーションではあまりうまくいかないようです。私はFolderBrowserDialogをオープンしようとしていますが、私は私に告げる例外を得ていた。指定したCOMアパートメントの状態を設定できません

Current thread must be set to single thread apartment (STA) mode before OLE calls can be made.

が、私は私の主な方法でSTAThreadAttributeセットを持っていますが、FolderBrowserDialogは、私のメインスレッド以外のスレッドから呼び出されています。試しました

しかし例外はFailed to set the specified COM apartment stateでした。

STAモードで新しいスレッドを作成してFolderBrowserDialogを開く一時的な修正がありますが、これ以上の解決策があります。アパートの状態をSTAに設定できない原因は何ですか?

+1

OLE関連の関数にアクセスするスレッドを作成するときに、 'Threading.ApartmentState.STA'を設定する方が良いでしょう。 – Damith

答えて

8

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

複数のスレッドでウィンドウを使用することは、一般的には悪い考えです。スレッド上のウィンドウは、メインのUIスレッド上のウィンドウとZオーダー関係にありません。これは非常に扱いにくい問題を引き起こす可能性があります。メインウィンドウの背後に隠れるこのダイアログのように。タスクバーのボタンも、ユーザーは決してそれを見つけることはありません。

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

+0

ちょっと待って、起動前に現在の状態の状態をどうやって設定できますか? 'Thread.CurrentThread.SetApartmentState(...)'は、スレッドが既に実行されていることを意味しませんか? – kristianp

+0

それはナンセンスなコードなので、彼は例外を持っています。 SetApartmentState()は、Start()を呼び出す前に*厳密に呼び出さなければなりません。 –

+0

大丈夫、私はそれを得ると思う、ありがとう。 – kristianp

関連する問題