[STAThread]は何をしますか?


293

C#3.5を学習[STAThread]していますが、プログラムで何が行われているのか知りたいのですが?

回答:


240

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

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

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

このブログ投稿なぜSTAThreadが必要なのですか?)でも、要件が非常によく説明されています。スレッドモデルがCLRレベルでどのように機能するかについてさらに詳しく知りたい場合は、2004年6月(2009年4月)のこのMSDN Magazineの記事を参照してください。


1
CompactFrameworkがサポートしていない理由は[STAThread]何ですか?
bvdb

1
stackoverflow.com/questions/4154429/apartmentstate-for-dummiesこの答えは、私のような人間にとってはかなり理解できます。ただ、ここで参考のために追加されました
バリスAkkurt

41

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

このため、別のスレッドからGuiを呼び出す必要があります(フォームのコーディングを行った場合)。

基本的には心配する必要はありません。WindowsGUIスレッドをSTAとしてマークする必要があることを受け入れてください。そうしないと、変なことが起こります。


2
STAThreadは、GUIにアクセスするときにメインスレッドを呼び出す要件とは関係ありません。これは単にWindowsメッセージポンプの性質によるものであり、マルチスレッドアプリケーションでは一般的に避けられません。
ノルドリン2009

3
本当に、それはOSダイアログやサードパーティのコンポーネントのようなCOMコンポーネントを扱うことについてのみです。
ノルドリン2009

3
Win32には、スレッドアパートメントという概念はありません。COMは、その概念を導入しています。COMは、COMアパートメントでコード実行を同期/シリアル化する手段として、完全にスレッドにとらわれないシステム(Windowsメッセージポンプ)を「再タスク」します。
AnthonyWJones

1
Windows guiの広告をSTAとしてマークする必要があることを受け入れてください。そうしないと、奇妙なことが起こります。:))))))
Nipuna

1
@Noldorin "メインスレッドを呼び出すための要件"-これは技術的に要件ではありません。スレッド間例外はデバッガーの外部では発生しません。参照:stackoverflow.com/questions/3972727/…。ただし、この問題を解決すべきではないと言っているのではありません。
Shiv

31

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

詳細はこちら(アーカイブ、2009年6月)

そして

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.