私の目標は、最短時間で最大 6000 の URL から回答を得ることです。多少の遅延が発生し始めるまで、非常にうまく機能していました (5200 の LAN アドレスで 12 秒)。
ThreadPool.RegisterWaitForSingleObject
私のコードは、タイムアウト処理のために最大 20 個の同時 HttpWebRequest.BeginGetResponse を使用します。
ただし、リクエストの一部 (5,000 分の 4 まで) は、2 番目のパラメーター (timedOut) が true の TimeoutCallback 関数に到達せず、BeginGetResponseCallback 関数に到達してから WebException が発生するまで、5 分間の貴重な時間を無駄にします。例外は「操作が制限時間に達しました」のようなものですが、例外メッセージがポルトガル語(私の母国語)であるため、Googleで検索できませんでした。
この制限時間を、たとえば 20 秒に短縮できないかと考えています。誰でも方法を知っていますか?私はすでに試しました:
<system.web>
<httpRuntime executionTimeout="20"/>
</system.web>
しかし、コンソール アプリケーションとして実行しているため、ASP.NET 構成が機能しません。そして私も試しました:
myHttpWebRequest.Timeout = 20*1000;
と
ThreadPool.RegisterWaitForSingleObject(result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), AsyncState, 20*1000, true);
成功せずに。手伝って頂けますか?
更新 私が言おうとしているのは、非同期 HTTP 要求には 4 つの可能な結果があるということです。
- コールバック関数に到達しない -> タイムアウト コールバック関数
- リーチして正常に応答する
- 到達して例外を発生させる
- コールバック関数内で「時間制限」Web 例外が発生するまで、正確に 5 分遅らせる
4 つ目の可能性は、アプリケーションの遅延であり、その遅延を短縮する方法がわかりません。
更新GetResponseStream
の代わりに
メソッドGetResponse
がタイムアウトの原因である可能性はありますか?