2010-12-11 13 views
2

バックグラウンドスレッドのSTA COMオブジェクトを使用しています。COMオブジェクトのモードがSTAであるため、STAスレッドモードの新しいスレッドからメソッドを呼び出すと、そのメソッドがブロックされます。UIスレッドもブロックされているようですが、このUIのブロックを回避できますか?STAスレッドモードスレッドは、winform UIスレッドもブロックしますか?

答えて

5

これはSTAのポイントです。COMは、ワーカースレッドからSTAスレッドへの呼び出しを自動的にマーシャリングします。そのため、COMサーバーメソッドは常にスレッドセーフな方法で呼び出されます。メソッドがブロックされると、STAスレッドもブロックされます。通常はUIスレッドです。

これは、このCOMオブジェクトをスレッドで使用すると、実際に何も達成されないことを意味します。実際の問題がCOMサーバーにあるという別の問題については、ブロックしてはいけません。これがデッドロック状態でないことを確認してください。

考えられる回避策は、少なくともあなたのUIスレッドがブロックされないように、別のSTAスレッドでCOMサーバーを作成することです。サンプルコードはthis answerをご確認ください。 Thread.SetApartmentStateとApplication.Runの両方の呼び出しは、サーバーの快適なホームを作成するために重要です。

関連する問題