質問

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プロジェクトのメイン関数の前に記述されています。それは何もしませんが、プログラムが単一のスレッドを作成できるようにします。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top