web-dev-qa-db-ja.com

[STAThread]は何をしますか?

私はC#3.5を学んでいます、そして私は私達のプログラムで[STAThread]が何をするのか知りたいですか?

266
odiseh

STAThreadAttributeは、基本的にWindowsメッセージポンプがCOMコンポーネントと通信するための要件です。コアWindowsフォームはCOMを使用しませんが、システムダイアログなどのOSの多くのコンポーネントはこのテクノロジを使用します。

MSDN 理由をもう少し詳しく説明します。

STAThreadAttributeは、アプリケーションのCOMスレッドモデルがシングルスレッドアパートメントであることを示します。この属性は、Windowsフォームを使用するアプリケーションのエントリポイントに存在する必要があります。省略すると、Windowsコンポーネントは正しく機能しない可能性があります。属性が存在しない場合、アプリケーションはマルチスレッドアパートメントモデルを使用します。これはWindowsフォームではサポートされていません。

このブログ記事なぜSTAThreadが必要なのですか?)もその要件を非常によく説明しています。スレッドモデルがCLRレベルでどのように機能するかについてより詳細な情報が必要な場合は、 2004年6月からのこのMSDNマガジン記事 (アーカイブ、2009年4月)を参照してください。

226
Noldorin

シングルスレッドアパートメントモデルに属していることをコンパイラに伝えます。これは邪悪なCOMのことです、それはそのSTAとして実装されているその描画にWin32を使用しているのでそれは通常Windowsフォーム(GUI)のために使用されています。あなたが複数のスレッドからのSTAモデルである何かを使っているならば、あなたは破損したオブジェクトを取得します。

これが、他のスレッドからGuiに呼び出す必要がある理由です(何らかのフォームコーディングを行った場合)。

基本的には心配しないでください。WindowsGUIスレッドはSTAとしてマークされなければならないことを受け入れてください。そうでなければ奇妙なことが起こります。

30
Spence

STAThreadAttributeは、COMが必要な場合にシングルスレッドCOMアパートメントを使用するスレッドをマークします。デフォルトでは、.NETはCOMをまったく初期化しません。 COMが初期化されるのは、COMオブジェクトやCOMコントロールが作成されたときやドラッグアンドドロップが必要なときのように、COMが必要なときだけです。その場合、.NETは基になるCoInitializeEx関数を呼び出します。この関数は、スレッドをマルチスレッドアパートメントとシングルスレッドアパートメントのどちらに結合するかを示すフラグを取ります。

詳細を読む ここ (アーカイブ、2009年6月)

そして

なぜSTAThreadが必要なのですか?

29
rahul