104

STAThread に関する MSDN の記事から:

アプリケーションの COM スレッド モデルがシングル スレッド アパートメント (STA) であることを示します。

(参考までに記事全文です。)

シングルスレッドのアパートメント... OK、それは私の頭を通り過ぎました。また、アプリケーションが COM 相互運用機能を使用しない限り、この属性は実際には何もしないことをどこかで読みました。では、それは正確には何をし、マルチスレッド アプリケーションにどのように影響するのでしょうか? マルチスレッド アプリケーション (スレッドTimerプールなどだけでなく、s を使用するすべての人から非同期メソッド呼び出しまでを含む) は、「安全のため」であっても MTAThread を使用する必要がありますか? STAThread と MTAThread は実際に何をしますか?

4

3 に答える 3

61

アパートメント スレッドは COM の概念です。COM を使用しておらず、呼び出した API のいずれも「内部で」COM を使用していない場合は、アパートメントについて心配する必要はありません。

アパートに注意する必要がある場合は、詳細が少し複雑になる可能性があります。おそらく単純化しすぎたバージョンは、STA としてタグ付けされた COM オブジェクトは STAThread で実行する必要があり、MTA とマークされた COM オブジェクトは MTA スレッドで実行する必要があるということです。これらの規則を使用して、COM はこれらの異なるオブジェクト間の呼び出しを最適化し、不要なマーシャリングを回避できます。

于 2008-10-03T01:42:26.010 に答える
3

CoInitializeCOINIT_APARTMENTTHREADED をパラメーターとして指定して呼び出されることを保証します。COM コンポーネントまたは ActiveX コントロールを使用しない場合、まったく影響はありません。もしそうなら、それは一種の重要なことです。

アパートメント スレッドのコントロールは事実上シングル スレッドであり、それらに対する呼び出しは、それらが作成されたアパートメントでのみ処理できます。

MSDN からの詳細:

シングルスレッド アパートメント (STA) で作成されたオブジェクトは、アパートメントのスレッドからのみメソッド呼び出しを受け取るため、呼び出しはシリアル化され、メッセージ キューの境界にのみ到着します (Win32 関数 PeekMessage または SendMessage が呼び出されたとき)。

マルチスレッド アパートメント (MTA) の COM スレッドで作成されたオブジェクトは、いつでも他のスレッドからメソッド呼び出しを受信できる必要があります。通常、オブジェクトのデータを保護するために、クリティカル セクション、セマフォ、ミューテックスなどの Win32 同期プリミティブを使用して、マルチスレッド オブジェクトのコードに何らかの形式の同時実行制御を実装します。

ニュートラル スレッド アパートメント (NTA) で実行するように構成されているオブジェクトが、STA または MTA のいずれかにあるスレッドによって呼び出されると、そのスレッドは NTA に転送されます。このスレッドがその後 CoInitializeEx を呼び出すと、呼び出しは失敗し、RPC_E_CHANGED_MODE が返されます。

于 2008-10-03T01:38:32.617 に答える
-15

STAThread は、C# GUI プロジェクトの Main 関数の前に記述されます。プログラムが単一のスレッドを作成できるようにするだけです。

于 2012-03-21T13:48:23.473 に答える