使用超时最好的办法HttpWebRequest.BeginGetResponse(Best appr

2019-09-17 02:27发布

HttpWebRequest.BeginGetResponse doesn't尊重从HttpWebRequest的任何超时属性(超时或ReadWriteTimeout)。

我读了一些方法来得到相同的结果,但我不知道这是否是做的最好的方式,如果我需要使用几个电话或者我可以扩展它的内部循环(我做的WebCrawler)。

重要的是,最初我的代码isn't异步,我只需要异步,因为我的方法应该接受的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();
    }
}

呼叫(再次,它isn't异步)

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

HandleCancellation(request, getResponseResult, cancellationToken);

return (HttpWebResponse)request.EndGetResponse(getResponseResult);

参考: 多的WebRequest的管理更好的方法

Answer 1:

对于MSDN文档BeginGetResponse对如何处理超时一个很好的例子。 它的工作非常好,我在我的网络爬虫。



文章来源: Best approach to Timeout using HttpWebRequest.BeginGetResponse