1

タスク: 私は静的クラスを使用しているため、既にロードされているデータを全員が共有しています。誰かが変更を加えた場合、そのリクエストはインクリメンタル ID を持つリストにアイテムを配置します。私の考えでは、すべてのクライアントがクライアント側にそのバージョンを持ち、変更があるかどうかをリクエストします。

私の解決策:このために、5000ミリ秒のタイムアウトで$.postを使用し、クライアントバージョンを送信します。サーバー側では、新しいものがあるかどうかを確認してループを破る500サイクルのループがあり、変更を返し、10ミリ秒がありますすべてのサイクルで Thread.Sleep を実行して、CPU を占有しないようにします。クライアントでタイムアウトした場合、エラーが発生した場合は、投稿を再度呼び出します。成功した場合は、戻りデータを処理してから、投稿を再度呼び出します。このようにして、圧倒的な数のリクエストなしで常に変更をほぼ即座に取得する必要があり、何かが失敗した場合でも、再開するまで 5 秒待つだけで済みます。

私の問題は、このループが実行されると、他のリクエストが処理されないことです。asp.net 開発サーバーでは、シングル スレッドなので問題ありません。しかし、それは win7hp iis7.5 にも当てはまります。

私が試したこと: レジストリ (HKLM\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0\MaxConcurrentRequestsPerCPU) に設定し、アプリケーション プールのワーカー スレッドを増やし、aspnet.config ファイルを maxConcurrentRequestsPerCPU="12" maxConcurrentThreadsPerCPU= で更新します。 「0」requestQueueLimit="5000" 設定、および私の win7hp は 3 つのスレッドを使用できる必要があることも読みました。また、あるリクエストで同じ変数を使用して他のリクエストをキューに入れるのは最適化だと思ったので、それらの行にコメントを付け、for ループをスリープのみのままにしましたが、結果は同じでした。

4

1 に答える 1

1

ASP.Net で要求を処理するスレッドで Thread.Sleep を使用しないでください。これにより、基本的にスレッドが消費され、それ以上のリクエストが開始されなくなります。変更しようとした要求を処理するために ASP.Net が作成するスレッドの数には制限がありますが、スレッド数が多いとプロセスの応答が遅くなり、32 ビット プロセスで OutOfMemeoryException が発生しやすくなるため、適切なルートではありません。

このような ASP.Net でのロング ポール リクエストの実装について議論しているスレッドが他にもいくつかあります。そして明らかに、このようなCometの質問 - ASP.NETのComet実装? .

于 2012-07-05T08:00:42.907 に答える