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