2009-09-01 19 views

答えて

199

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

MSDNは、もう少し詳細に理由を説明します

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

This blog post

も非常によく要件を説明します( STAThreadであるのはなぜか?が必要)。スレッディングモデルがCLRレベルでどのように機能するかについての詳細な説明は、 this MSDN Magazine article from June 2004(Archived、Apr. 2009)を参照してください。

+1

CompactFrameworkは '[STAThread]'をサポートしていない理由を任意のアイデア? – bvdb

20

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

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

基本的には心配しないでください。Windows GUIスレッドにはSTAとマークする必要があります。さもなければ変なことが起こります。

+1

STAThreadは、GUIにアクセスするときにメインスレッドを起動する必要性とは関係ありません。これは単にWindowsメッセージポンプの性質によるものであり、マルチスレッドアプリケーションでは一般的に回避できません。 – Noldorin

+3

実際には、OSのダイアログやサードパーティのコンポーネントなど、COMコンポーネントを扱うことしかありません。 – Noldorin

+3

Win32は、概念を導入したCOMというスレッドアパートメントの概念を持ちません。 COMアパートメントのコード実行を同期/シリアライズするための手段として、完全にスレッドに依存しないシステム(Windowsのメッセージポンプ)であったCOMの「再タスク」。 – AnthonyWJones

27

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

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

Why is STAThread required?

関連する問題