2

この質問に入る前に、私は IIS 7、7、7.5 のスレッド モデリングを読んだので、スレッドがどのように処理されるかを知っています。

私のアプリケーションは、リクエストが来るとスレッドを開始します。

スレッドを cron ジョブと見なすことができます。

  1. GET リクエストが入ってきます。/Handle としましょう
  2. /Handle のスコープで、そのアクションからスレッドを開始します。THREAD A
  3. GET リクエストを長くポーリングしていないため、すぐにユーザーに返されます。したがって、GET を処理するスレッドは POOL に返されます。
  4. 次に、スレッド A が他の処理を完了するまで待ちます。
  5. したがって、私の知る限り、スレッドは実行されていません。GET を処理していたスレッドとスレッド A の両方が終了しました。

同じリクエストを数回連続して行います。私は常に両方のスレッドが終了するのを待ちます。しばらくすると、`Thread.Start()1 関数がブロックされます。

質問 : スレッドが戻ってきて、ゴースト スレッドがリークしていないことはわかっています。IIS が 4 ~ 5 回のリクエスト後に新しいスレッドを開始できないのはなぜですか。?

ユーザー アプリケーションのアプリケーション スレッドを作成する正しい方法は何ですか。私が言った場合Thread t= new Thread()、これはGETSまたはCLRを処理したプールからスレッドを割り当てますか? IIS7を使用しています。

各スレッドを終了し、 THREAD A で JOIN を呼び出し、ブロックすることはありません。この時点では、スケーラビリティについて心配していないため、常に 1 人のユーザーがサーバーに順番にアクセスしています。

4

1 に答える 1

2

では、 「ユーザーアプリケーションのアプリケーションスレッドを作成する正しい方法は何ですか?」という質問に答えるために。(つまり、ASP.NETアプリケーション)-多くのオプションがあります:

  • スレッド化せずにASP.NETスレッドで実行-ASP.NETは引き続き複数の要求を処理します
  • 長時間実行される操作には、非同期呼び出し(非同期操作を参照)を使用します
  • CLRThreadPoolを使用する
  • 他のサーバーにメッセージを送信する(たとえば、WCFサービスを使用する)ため、長時間実行される処理はWebサーバーの外部で行われます。

ASP.NETでのスレッド化について読んだとおっしゃいましたが、「MSDN:ASP.NETアプリケーションでの非同期作業またはタスクの実行」には、ASP.NETでのスレッド化のしくみについての比較的短い説明があります。投稿の最後に、 「Q4:独自のスレッド(新しいスレッド)を作成する必要がありますか?」という質問があります。その質問に対する答えは「A4)しないでください(新しいスレッドを作成してください)。別の言い方をすれば、いいえ!!!(...)」です。

そして、あなたの質問に答えるために:「IISが4-5のリクエストの後に新しいスレッドを開始することを許可しないのはなぜですか?」 これは本当に奇妙な動作です。IISはあなたが間違っていることを知っているかもしれません;)

于 2012-12-13T18:52:25.837 に答える