HttpWebRequest を使用して非同期にリクエストを行うことについて私が理解していることは次のとおりです。
非同期 Web リクエストを作成するための基本的な構造は、BeginGetResponse() を呼び出し、同時にタイマーを開始することです。応答がタイムアウトしない場合、BeginGetResponse() は、EndGetResponse() を呼び出して応答を読み取るコールバック メソッドを呼び出します。応答がタイムアウトした場合、タイマーに対する別のコールバック メソッドが呼び出され、WebRequest.Abort() が呼び出されます。
この構造は、Abort() と EndGetResponse() が排他的であることに依存しています。EndGetResponse() の後に Abort() を呼び出しても基本的には効果がなく、Abort() の後に EndGetResponse() を呼び出すと、EndGetResponse() が例外をスローし、それをキャッチして処理することができますが、タイムアウトを処理したい場合です。
私の問題は、複数のサービスに対して毎秒数百のリクエストを行う必要があり、1 つのサービスが非常に潜在的になり始めたときです。タイムアウト コールバックは 500 ミリ秒後に呼び出され、Abort() を呼び出し、私のプログラムは問題なく続行されます。しかし、サービスは 10 秒後にまだ返されていないため、BeginGetResponse() によって開始された最初のスレッドはまだ待機しており、ネットワーク接続リソースは今後の要求で使用できません。
おそらくタイムアウトしているスレッドのリソースをタイムアウトで解放する方法はありますか? そうでない場合、アプリケーションとは異なるネットワーク層で要求をタイムアウトにするように設定できる Web.config 値のようなものはありますか?