質問
私はC#3.5を学んでいると私は、我々のプログラムで何[STAThread]
知りたいですか?
解決
STAThreadAttribute
は、本質的にCOMコンポーネントと通信するためにWindowsメッセージポンプの要件です。コアWindowsフォームは、COMを使用していませんが、このようなシステムのダイアログなどOSの多くのコンポーネントは、この技術を使用して行います。
MSDN にわずかに理由を説明詳細ます:
STAThreadAttributeがあることを示し 以下のためのCOMスレッドモデル アプリケーションはシングルスレッドです アパート。この属性は、でなければなりません いずれかのエントリポイントに存在します Windowsフォームを使用するアプリケーション。 これは、Windowsの省略された場合 コンポーネントが正しく動作しない可能性があります。 属性が存在しない場合は、 アプリケーションは、マルチスレッドを使用しています ありませんアパートメントモデル、 Windowsフォームではサポートされています。
このブログの記事に(のなぜ必要?のSTAThread)も非常によく要件を説明しています。あなたがスレッドモデルは、CLRレベルでどのように機能するかについてのより詳細なビューをしたい場合は、<のhref = "https://web.archive.org/web/20090417041403/http://msdn.microsoft.comを参照してください2004年6月のから/en-us/magazine/cc188722.aspx」のrel = "noreferrer">このMSDNマガジンの記事(2009年4月のアーカイブ)。
他のヒント
それはあなたがシングルスレッドアパートメントモデルにしているコンパイラに指示します。これは、邪悪なCOMのものであることがSTAとして実装され、その描画のためのWin32を使用して、通常は(GUIの)Windowsフォームのために使われています。あなたが複数のスレッドからSTAモデル何かを使用している場合は、破損したオブジェクトを取得します。
あなたは(あなたがコーディングの任意のフォームをやった場合は)別のスレッドからグイ上に呼び出す必要があり理由です。
基本的にはちょうどSTAそうでない奇妙なものが起こるようにWindowsのGUIスレッドがマークされなければならないことを受け入れて、それについて心配しないでください。
STAThreadAttributeスレッドをマーク シングルスレッドCOMを使用するには COMが必要な場合は、アパート。沿って デフォルトでは、.NETはでCOMを初期化しません。 すべて。これは、COMが必要とされている場合のみですが、 以下のようなとき、COMオブジェクトまたはCOMコントロール 作成またはドラッグ「n」の低下があるさ 必要に応じて、そのCOMが初期化されます。いつ それが起こる、.NETコール CoInitializeEx機能の基礎となります、 かどうかを示すフラグをとります マルチスレッドにスレッドに参加します またはシングルスレッドアパートメントます。
詳細はを読みますここの(アーカイブされた、2009年6月)
と