0

サードパーティの win32 dll をすべてのビジネス ロジックのゲートウェイとして使用する Web アプリケーション (MVC) を構築する必要があります (ログオン メカニズム、関数を含み、状態を維持します)。この dll は、マルチスレッド用に設計されていません。MTA シナリオでは、dll は一定時間後につまずきます。推奨される解決策は、ASP.NET MVC を ASP クラシック モード (Asp-CompatHandler を使用する STA) で実行することです。これを試してみましたが成功しました - すべてが安定して動作します。問題は、多数の同時ユーザーが存在し、一部の関数呼び出しに数秒 (最大 10 秒!) かかることです。すべてのユーザーがお互いをブロックすると、これは恐ろしいことになります。同じアプリケーション内でブロッキング効果を最小限に抑える最善の方法は何ですか? 互いにブロックする必要があるのは 10 人のユーザーだけだとしますか?

...Web は MTA で実行されます ...Web は一度展開されるだけです ...すべてが同じプロセス内で実行されます

これを解決する良いコンセプトについて誰かアドバイスをもらえますか?

ありがとうございました!マーティン

更新 - 解決策が見つかりました: Ami Bar の「Smart Thread Pool」のおかげで、探していた動作を (簡単に) 実現できました。ワーカーの概念 (特定のユーザー数がワーカーを共有し、このワーカー内で互いにブロックする) を実装し、ワーカーごとに、1 つのスレッドの最大数と最小数を持つ独自のスレッド プール インスタンスを作成しました。これはスレッド プールのアイデアではありませんが、作業項目の処理が非常に簡単になり、他にも優れた機能がいくつかあります。現在、Web アプリケーションは MTA で実行されています。数時間にわたって安定しているかどうかを確認するために、いくつかの負荷テストを準備します。ここを参照してください: http://www.codeproject.com/Articles/7933/Smart-Thread-Pool

4

2 に答える 2

0

答えは非常に簡単ですが、あまり気に入らないと思いますが、マルチスレッド環境で使用するように設計されていないものをマルチスレッド環境で使用することはできません。

2 つの可能性:

  • STAと暮らす
  • シングル スレッドの COM オブジェクトを、Web アプリケーションでの使用を意図したものに置き換えます。
于 2012-09-24T11:11:03.003 に答える
0

残念ながら、dll が並列要求で使用するように設計されていない場合、並列要求で使用することはできません。

アプリケーションを並行して実行せずに同時ユーザーの数を増やす唯一の解決策は、アプリケーションの複数のインスタンスを同時に実行し、それらの前にロードバランサーを配置してクエリをディスパッチすることです。

于 2012-09-24T11:13:46.983 に答える