私はWPFの新人です。私が読んだすべてのチュートリアルでは、Main
メソッドに[System.STAThread]
属性が適用されているか、読者にそのことを伝えています。MainメソッドにWPFでSTAThread属性を適用する必要があるのはなぜですか?
この属性は本当に「必須」ですか?もしそうなら、なぜですか?
私はWPFの新人です。私が読んだすべてのチュートリアルでは、Main
メソッドに[System.STAThread]
属性が適用されているか、読者にそのことを伝えています。MainメソッドにWPFでSTAThread属性を適用する必要があるのはなぜですか?
この属性は本当に「必須」ですか?もしそうなら、なぜですか?
これはWPFよりもWindowsの要件であり、.NETの前からWindowsフォームとコントロールの元のデザインに戻ります。
STAThreadは、現在の(メイン)スレッドが使用するスレッドモデルを参照する「シングルスレッドアパートメント」を指します。使用されているスレッドモデルは、他の.NETアプリケーションとCOMアプリケーションがアプリケーション(および本質的にそのスレッド)とどのように通信するかを指示します。単一スレッドのアプリケーションモデルでは、一度に複数のSTAスレッド、つまりMTAスレッドモデルとは異なる単一のオブジェクトは存在しないことが必要です。オブジェクトとしてマーシャリングするだけでアパートメント全体のデータにポインターを渡すことができます。
[STAThread]宣言では、基本的に、他のアプリケーションがデータを送信する際のスレッドのポリシーを知ります。 STAモデルは、Windowsスレッド/アプリケーションの最も一般的なスレッドモデルです。 STAの制約を遵守しない方法でスレッドの境界を越えてデータを送受信するように設計されているため、STAモデルのスレッドから呼び出された場合に実行されない特定のコードを見つけることがあります。ランタイム中にスレッド境界を越えてオブジェクトを使用しようとすると、IDEが特定のスレッドのアパートメントモデルによってIDEがコンパイル時にこれらの例外をキャッチできることを事前に知ることができます。
あなたはでMSDNの記事からSTAとMTAスレッドについて読むことができます(WPF前から)でも、通常の.NETアプリケーションは、メインの上に[STAThread]宣言を必要とすることhttp://msdn.microsoft.com/en-us/library/ms680112(VS.85).aspx
注()。
この回答は素晴らしいblog entryです。ブログから引用
:STAThreadAttributeが 適用されると
、それは シングルスレッドであることを、現在のスレッドのアパート 状態を変更します。 COMについての大きな議論と スレッディングに陥ることなく、 現在のスレッドと がCOMを介して話したがっているかもしれない他のスレッドとの間の通信メカニズムを保証します。 Windowsフォームを使用している場合は、使用している機能の に応じて、 オペレーティングシステム コンポーネントと通信するために、COM相互運用機能を使用すると となる場合があります。その良い例は、 クリップボードとファイルダイアログです。
Windowsフォームは、 MTAまたは無料のスレッドアパートメント内ではサポートされていません。 Windowsフォーム を使用するアプリケーションは、他の コンポーネントが スレッドのアパートメント状態を不適切に初期化できるため、使用しているアパートメント のスタイルを常に宣言する必要があります。
初心者のために "過度に複雑でない"ならば、あなたはする必要はありません..私は読むのが大好きです:) –
参考になるようにここにサマリーを載せておきましょう。もしこのブログがオフラインになると、投稿は削除され、Microsoftはhellfireのボールで燃えます。 –