4

HttpWebRequest.BeginGetResponse は、HttpWebRequest の Timeout プロパティ (Timeout または ReadWriteTimeout) を考慮しません。

同じ結果を得るためにいくつかのアプローチを読みましたが、それが最善の方法であるかどうか、いくつかの呼び出しに使用する必要があるかどうか、またはループ内でスケーリングできるかどうかはわかりません(私はwebcrawlerを実行しています)。

重要なことは、最初は私のコードは非同期ではないということです。私のメソッドは CancellationToken を受け入れる必要があるため、非同期が必要なだけです。

私の懸念は、WaitHandles と ThreadPool.RegisterWaitForSingleObject についてです。これは日常的なコードではないので、近い将来に問題が発生する可能性があるかどうかはわかりません。

private static void HandleCancellation(HttpWebRequest request, IAsyncResult getResponseResult, CancellationToken cancellationToken)
{
    using (WaitHandle requestHandle = getResponseResult.AsyncWaitHandle)
    {
        ThreadPool.RegisterWaitForSingleObject(requestHandle, TimeoutCallback, request, request.Timeout, true);

        //If request finish or cancellation is called
        WaitHandle.WaitAny(new[] {requestHandle, cancellationToken.WaitHandle});
    }

    //If cancellation was called
    if (cancellationToken.IsCancellationRequested)
    {
        request.Abort();
        cancellationToken.ThrowIfCancellationRequested();
    }
}

呼び出し中 (繰り返しますが、非同期ではありません)

IAsyncResult getResponseResult = request.BeginGetResponse(null, null);

HandleCancellation(request, getResponseResult, cancellationToken);

return (HttpWebResponse)request.EndGetResponse(getResponseResult);

参照:複数の WebRequest の管理におけるより良いアプローチ

4

1 に答える 1

3

BeginGetResponseの MSDN ドキュメントには、タイムアウトの処理方法の非常に良い例があります。私の Web クローラーでは非常にうまく機能しました。

于 2012-05-10T03:51:56.833 に答える