27334


.NETでForms/WPFを使う場合にお約束のように付けられている `STAThreadAttribute`
ですが、クリップボードを扱う場合などはコンソールアプリでも付ける必要があります。

では逆に、`STAThreadAttribute` を付けない方がいい場合はあるのでしょうか。

COMサーバを作る場合であれば、MTAの方が複数スレッドから呼び出せることでパフォーマンス向上が狙えるかと思いますが、そうでないアプリケーションでMTAにする理由はあまりないように思えます。.NET内部でCOMサーバーになっているケースもあるとは思いますが、それが前述の
`STAThreadAttribute` が必要な場面だとすると、結局STAにせざるを得ません。

だとするとコンソールアプリケーションやサーバー等を作る場合でも、とりあえず `STAThreadAttribute`
を付けておけばいいのでは？と思ったのですがどうでしょうか。

参考サイト

  * [STAとMTA - EthernalWindows](http://eternalwindows.jp/com/apartment/apartment01.html)
  * [アパートメントモデルと、.NETのSTAThreadAttribute - Bug Catharsis](http://zecl.hatenablog.com/entry/20070708/p1)
  * [STAThreadの意味は？: .NET Tips: C#, VB.NET](http://dobon.net/vb/dotnet/form/stathread.html)


CC BY-SA 3.0
2016-07-04T13:53:30.730
27333
2016-07-04T14:42:08.480
8000
question
.net com
STAThreadAttributeを付けない方がいいのはどんなアプリケーション？


[STA; Single-Threaded Apartments](https://msdn.microsoft.com/en-
us/library/ms680112\(v=vs.85\).aspx)はあまり知られてはいませんが

> Each single-threaded apartment **must have a message loop** to handle calls
> from other processes and apartments within the same process. Single-threaded
> apartments without objects (client only) also **need a message loop** to
> dispatch the broadcast messages that some applications use.

とあり、単にスレッドをSTAで初期化すればいいというわけではなく状況によってはメッセージループを回す必要があります。  
ですので、.NET
Frameworkとしても確実にメッセージループを回すWinFormsやWPFのようなプロジェクトでなければ、`[STAThread]`が付与されずMTAで初期化するようにしているのだと思います。


CC BY-SA 3.0
2016-07-04T14:42:08.480
27334
2016-07-04T14:42:08.480
4236
27333
answer