一部のコンポーネントSTA
を使用するには、ASP.NET アプリケーション内で複数のスレッドが必要です。COM
各プロセス内のどこかを読みましたが、STA
存在できるスレッドは1つだけです。サンプル プロジェクトをコーディングし、多くのスレッドを作成し、それらのアパートメントの状態を に設定するSTA
と、COM
例外なくオブジェクトを操作できます。
プロセス内に多くのSTA
スレッドを持つことは可能ですか?
一部のコンポーネントSTA
を使用するには、ASP.NET アプリケーション内で複数のスレッドが必要です。COM
各プロセス内のどこかを読みましたが、STA
存在できるスレッドは1つだけです。サンプル プロジェクトをコーディングし、多くのスレッドを作成し、それらのアパートメントの状態を に設定するSTA
と、COM
例外なくオブジェクトを操作できます。
プロセス内に多くのSTA
スレッドを持つことは可能ですか?
使用できる STA スレッドの数に固有の制限はありませんが、おそらく独自にそのような制限を課したいと思うでしょう。
ASP.NET アプリケーションが新しいユーザー要求の到着時に追加の STA スレッドを作成できるようにする場合、それを制限せずに、CPU がコンテキストの切り替えに費やす時間が長くなりすぎて、最終的にスレッドの数によってアプリケーションのパフォーマンスが低下します。 . これにより、アプリケーションはサービス拒否攻撃に対してより脆弱になります。
ハードウェアまたはユーザー プロファイルに基づいて STA スレッドの数に制限を設定し、制限に達したら、既存の STA スレッドを再利用して新しい要求を処理するためにいくつかのプールを実装する設計を検討できます。
メモリ以外に上限はありません。スレッドのスタックが使用可能なすべてのアドレス空間を消費した場合、32ビットプロセスは通常、2000スレッドをやや恥ずかしがり屋にします。
ルールを覚えておいてください。マーシャリングなしで、あるSTAで作成されたオブジェクトを別のSTAから呼び出すことはできません。また、必要なメッセージループを忘れないでください。マーシャリングを存続させ、デッドロックを防ぐために、STAスレッドはポンピングする必要があります。明らかに、メモリ制限に近づくことは強く避けてください。
プログラムが多くの STA スレッドで動作する場合、なぜそれが動作するかどうかを尋ねるのですか? :) .NET では、STA スレッドをいくつでも持つことができるため、動作する必要があります。ただし、メイン スレッドが 1 つとメッセージ ループが 1 つしかない典型的なネイティブ アプリケーションの場合は、この内容が当てはまる場合があります。
標準の STA スレッドに実際の制限はありませんが、メッセージ ループを持つ UI 用の「特別な」STA スレッドは 1 つだけです。これは、他の場所で読んだものかもしれません。ほとんどの COM はどの STA スレッドでも問題ありませんが、一部の COM ではメッセージ ループ (タイマー ティックなど) が必要な場合があり、UI スレッドまたはメッセージ ポンピングをポイントする必要があります。
http://blogs.msdn.com/b/cbrumme/archive/2004/02/02/66219.aspx