私はWPFを初めて使用します。私が読んだすべてのチュートリアルでは[System.STAThread]
、メソッドに属性が適用されているかMain
、読者にそれを行うように指示しています。
この属性は本当に「必須」ですか? もしそうなら、なぜですか?
これは WPF よりも Windows の要件であり、.NET より前の Windows フォームとコントロールの元の設計に戻ります。
STAThread は、現在の (メイン) スレッドで使用されるスレッド モデルを指す「シングル スレッド アパートメント」を指します。使用中のスレッド モデルによって、他の .NET および COM アプリケーションがアプリケーション (および本質的にそのスレッド) と通信する方法が決まります。MTA スレッド モデルとは対照的に、シングル スレッド アプリケーション モデルでは、1 つのオブジェクトが一度に複数の STA スレッドに "存在" することはありません。また、marshaling-as-object を介してのみ、アパートメント間でデータへのポインターを渡すことができます。
基本的に、[STAThread] 宣言を使用すると、他のアプリケーションは、データを送信するときにスレッドのポリシーが何であるかを知ることができます。STA モデルは、Windows スレッド/アプリケーションの最も一般的なスレッド モデルです。ただし、STA 制限に準拠しない方法でスレッド境界を越えてデータを送受信するように設計されているため、STA モデルのスレッドから呼び出された場合に実行されない特定のコードに遭遇することがあります。特定のスレッドのアパートメント モデルを事前に把握しておくと、実行時にスレッドの境界を越えてオブジェクトを使用しようとしたときに、厄介なアクセス違反エラーが発生する代わりに、IDE がコンパイル時にこれらの例外をキャッチできるようになります。
STA および MTA スレッドについては、MSDN の記事 ( http://msdn.microsoft.com/en-us/library/ms680112(VS.85).aspx ) を参照してください。
通常の .NET アプリケーション (WPF より前から) でさえ、main() の上に [STAThread] 宣言が必要であることに注意してください。
このブログエントリには、これに対する優れた答えがあります。
ブログから引用:
が
STAThreadAttribute
適用されると、現在のスレッドのアパートメント状態がシングル スレッドに変更されます。COM とスレッド化について大々的に議論するまでもなく、この属性は、現在のスレッドと、COM 経由でスレッドと通信する可能性のある他のスレッドとの間の通信メカニズムを保証します。Windows フォームを使用している場合、使用している機能によっては、オペレーティング システム コンポーネントと通信するために COM 相互運用機能を使用している場合があります。これの良い例は、クリップボードとファイル ダイアログです。Windows フォームは、MTA またはフリー スレッド アパートメント内ではサポートされていません。Windows フォームを使用するアプリケーションは、使用しているアパートメント スタイルを常に宣言する必要があります。これは、他のコンポーネントがスレッドのアパートメント状態を不適切に初期化する可能性があるためです。