namespace ComClientTest
{
class Program
static void Main(string[] args)
{
// COMを使った処理
}
}
}
何の変哲もないコンソールアプリケーションですが、
COMを呼び出している場合、1行のおまじないで劇的にパフォーマンスが改善することがあります。
namespace ComClientTest
{
class Program
[STAThread]
static void Main(string[] args)
{
// COMを使った処理
}
}
}
エントリポイント(この場合Main)に[STAThread]属性を付与するだけです。
あるプログラムではこれだけで速度が20倍になりました。
STAはシングルスレッドアパートメントの略で、そのほかにマルチスレッドアパートメント、中立スレッドアパートメント2つがあります。
STAを前提として実装されているCOMコンポーネントをMTAで呼び出すと余計なオーバーヘッドがかかって遅くなるらしい。
そして、C#では属性をなにもつけていないデフォルトの状態ではMTAになっているようです。
VB.NETではデフォルトがSTAであるため明示的にここを指定する必要はありません。ですので、全く同じコードを書いたのにVB.NETだと速い! というような現象が起こりえます。
VB.NETとC#との言語の違いは.NETではILという中間言語にコンパイルされる段階で吸収されるはず。だから同じロジックなら同じように動くはず。
と高を括っていると、思わぬ罠にハマることもあるという教訓でした。
STA、MTAなどの技術的な説明はWikipediaなどにしっかりと書かれていますが、詳細はわからなくてもおまじないとしてとりあえず追加しておく、というくらいの考え方でもよいかと思います。
ただし、COMを使っていないプログラムではなんの効果もないと思います(未検証)。