STAThreadおよびマルチスレッド
-
03-07-2019 - |
質問
STAThreadに関するMSDNの記事から:
アプリケーションのCOMスレッドモデルがシングルスレッドアパートメント(STA)であることを示します。
(参照用に、記事全体です。)
シングルスレッドアパートメント... OKまた、アプリケーションがCOM相互運用機能を使用しない限り、この属性は実際には何もしないことをどこかで読みました。それで、それは正確に何をし、マルチスレッドアプリケーションにどのように影響しますか?マルチスレッドアプリケーション(スレッドプールなどだけでなく、 Timer
を使用するすべてのユーザーから非同期メソッド呼び出しまでを含む)がMTAThreadを使用する必要がありますか? STAThreadとMTAThreadは実際に何をしますか?
解決
アパートメントスレッドはCOMの概念です。 COMを使用しておらず、呼び出すAPIのいずれもがCOMを使用していない場合、「隠れて」、アパートについて心配する必要はありません。
アパートメントに注意する必要がある場合、詳細は少し複雑な;おそらく単純化されたバージョンは、STAとしてタグ付けされたCOMオブジェクトをSTAThreadで実行し、MTAとマークされたCOMオブジェクトをMTAスレッドで実行する必要があるということです。これらのルールを使用して、COMはこれらの異なるオブジェクト間の呼び出しを最適化し、必要のない場所でのマーシャリングを回避できます。
他のヒント
それにより、 CoInitialize
がパラメーターとしてCOINIT_APARTMENTTHREADEDを指定して呼び出されます。 COMコンポーネントまたはActiveXコントロールを使用しない場合、まったく影響はありません。その場合、それは重要なことです。
アパートメントスレッドであるコントロールは、事実上シングルスレッドであり、それらに対して行われた呼び出しは、それらが作成されたアパートメントでのみ処理できます。
MSDNの詳細:
シングルスレッドで作成されたオブジェクト アパートメント(STA)受信メソッド呼び出し アパートのスレッドからのみ 呼び出しはシリアル化され、到着のみ メッセージキューの境界で( Win32関数PeekMessageまたは SendMessageが呼び出されます)。
のCOMスレッドで作成されたオブジェクト マルチスレッドアパートメント(MTA)は メソッド呼び出しを受け取ることができます いつでも他のスレッド。するでしょう 通常、何らかの形式を実装します マルチスレッドでの同時実行制御 Win32を使用したオブジェクトのコード などの同期プリミティブ クリティカルセクション、セマフォ、または オブジェクトの保護に役立つミューテックス データ。
に設定されているオブジェクト ニュートラルスレッドアパートメントで実行 (NTA)は、次のスレッドに呼び出されます STAまたはMTAのいずれか、そのスレッド NTAに転送します。このスレッドの場合 その後、CoInitializeExを呼び出し、 呼び出しは失敗して戻ります RPC_E_CHANGED_MODE。
STAThreadは、C#GUIプロジェクトのメイン関数の前に記述されています。それは何もしませんが、プログラムが単一のスレッドを作成できるようにします。