【发布时间】:2012-05-16 21:24:18
【问题描述】:
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);
【问题讨论】:
-
它给你带来了什么问题,你有很多异步请求使用等待超时的资源吗?为什么不让它超时。
-
你没有考虑过使用TPL吗?
-
我应该在哪里使用 TPL?我正在使用 Tasks 调用此方法,但不在方法内部
-
@BenRobinson 我的网络爬虫让我配置我同时下载的数量。如果我让它超时,当我调用取消令牌时,我需要等待所有下载超时
标签: c# asynchronous httpwebrequest timeout waithandle