STAThread属性について

http://dobon.net/vb/dotnet/form/stathread.html
http://techracho.bpsinc.jp/baba/2010_05_19/1559
STAは単一のスレッドで動くCOMを実行させるために必要なスレッドの属性。
thread.SetApartmentState で設定する。この属性にはMTA、STAがあり、STAでしか動作しないCOMはスレッドセーフではない。
.NET Frameworkの一部の機能は単一のスレッドで動くCOMを使用しているため、そのような機能を使用する場合は、必ずSTAにする必要がある。
STAでないと使用できない.NET Frameworkの機能には、以下のようなものがある。

ドラッグ&ドロップ機能
クリップボード関係の機能
OpenFileDialog、SaveFileDialogのようなFileDialogの派生クラスや、FolderBrowserDialogクラスによるダイアログの表示
WebBrowserコントロール
IMEの使用
RichTextBoxコントロールの一部の機能(未確認)
リフレクションを利用したメソッドの呼び出し(.NET Framework 1.0 のみ?)



http://eternalwindows.jp/com/apartment/apartment01.html

オブジェクトがSTAということは、 そのオブジェクトにアクセスできるスレッドが1つだけということであり、
これによりオブジェクトはデータの同期を意識する必要はなくなります。
オブジェクトがMTAということは、 そのオブジェクトにアクセスできるスレッドが複数存在する可能性があり、
オブジェクトはデータの同期が必須になります。
たとえば、オブジェクトの参照カウントを増加させる際には、 InterlockedIncrementを呼び出して変数の同時アクセスを防がなければなりません。