4

HttpWebRequest.BeginGetResponse 不尊重 HttpWebRequest(Timeout 或 ReadWriteTimeout)中的任何 Timeout 属性。

我阅读了一些方法来获得相同的结果,但我不知道这是否是最好的方法,我是否应该使用几个调用或者我可以在循环内缩放它(我正在做一个网络爬虫)。

重要的是,最初我的代码不是异步的,我只需要异步,因为我的方法应该接受 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 文档有一个很好的示例来说明如何处理超时。它在我的网络爬虫中对我来说非常有效。

于 2012-05-10T03:51:56.833 回答