2

私のアプリケーションは、Web サービスと "Application_Start" から大量の情報を非同期にロードします。

ユーザー要求がその情報を使用したいが、準備ができていない場合、スレッドは Monitor.Wait でブロックされます。情報の準備が整うと、キャッシュ オブジェクトは、待機中のすべてのスレッドを Monitor.Pulse します。情報には数十秒かかり、ユーザーはログイン ページにリダイレクトされ、ログイン情報を投稿し、再度リダイレクトされる必要があるため、これで問題ありません。

問題は、Monitor.Wait が CLR ThreadPool スレッドをブロックすることです。「大きな情報」を要求する要求のバーストが到着したかどうかを知る限り、アプリケーションは CLR ThreadPool の枯渇によってブロックされたままになる可能性があります (私は少し混乱しています)。現在の IIS/ASP.NET スレッド ゲーティングを使用)。

大部分の情報は、非同期で呼び出す Web サービスから取得されるため、その操作の IAsyncResult を取得します。

では、CLR ThreadPool スレッドに「この IOCP を待機する」ように指示して、スレッドプール スレッドが他の呼び出しに参加できるようにする方法はありますか?

これはよく説明されていないように感じます。質問の内容が明確でない場合はお知らせください。

よろしく。

PS: 報奨金は終了しましたが、その方法を誰かが知っている場合は、新しい方法を作成して著者に付与します。

4

2 に答える 2

2

これは素晴らしい質問です。私の経験では、ASP.NETの内部に干渉しようとすると、痛みが増します。

serviceAutoStartProvidersアプリをホットに保つために使用することを検討しましたか?

ASP.NET 4.0:アプリケーションウォームアップクラスの使用方法

于 2011-11-28T17:35:56.127 に答える
0

IHttpAsyncHandlerロードが遅いビッグデータを返す ために使用する必要があります。チュートリアル: 非同期 HTTP ハンドラーの作成

非同期 HTTP ハンドラーの処理中、ASP.NETは、ハンドラーが外部プロセスからコールバックを受信するまで、通常は外部プロセスに使用されるスレッドをスレッド プールに戻します。これにより、同時に実行できるスレッドの数が制限されるため、スレッドのブロックを防ぎ、パフォーマンスを向上させることができます。

から戻るのに 12 秒かかることは問題ありませんIHttpAsyncHandler。実際、心配することなく、約 60 秒まで簡単に上げることができるはずです。さらに、システムの状態を監視するために、ある種のロング ポーリングシステムを実装する必要がある場合もあります。

は、IHttpAsyncHandlerXML/JSON または任意のものを返すことができます。HttpWebRequest を使用する場合は、javascript の ajax (おそらくjQuery.ajax ) またはサーバー側で IHttpAsyncHandler を使用できます (いくつかのサンプル C# コード: Calling remote JSON webservice )。

于 2011-12-05T19:16:52.637 に答える