[英]Best approach to Timeout using HttpWebRequest.BeginGetResponse
[英]Setting Timeout On HttpWebRequest.BeginGetResponse
我有一个要移植到Windows 8商店类库的类库。 其中一种方法使用了现在不支持的同步HttpWebRequest。 我需要使方法保持同步,因为异步工作是在应用程序中完成的,而不是在库中完成的,而更改它需要花费很多精力。 我已将其更改为具有IAsyncresult的同步任务,但不确定如何使用此代码设置请求超时。 有人可以帮忙吗? 有人还能看到我在这段代码中可能遇到的任何其他问题吗?
//Create Web Request
HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest;
IAsyncResult asyncResult = request.BeginGetResponse(null, null);
if (asyncResult.AsyncWaitHandle.WaitOne(5 * 1000))
{
//Get Response
using (HttpWebResponse response = request.EndGetResponse(asyncResult) as HttpWebResponse)
{
if (request.HaveResponse && response != null)
{
using (Stream reader = response.GetResponseStream())
{
result = XDocument.Load(reader);
}
}
}
}
else
{
request.Abort();
}
更新:我已经为请求添加了一个等待句柄,如果超时,我将中止httpwebrequest。 这是否照顾到HttpWebRequest启动的所有线程?
怎么样:
if(false == request.GetResponseAsync().Wait(DateTime.Now.AddMinutes(2.0)))
{
Trace.WriteLine("timeout");
return;
}
//...
现在请记住,这只是等待异步操作的超时。 要专门处理响应/请求流操作的超时,请参见HttpWebRequest.Timeout
。
您不必对*Async
方法使用async
/ await
。 他们只是返回一个可以使用的Task<T>
对象,并使用诸如Wait
, ContinueWith
等方法……比处理Begin
/ End
(APM模式)要容易得多。
FWIW *Async
模式称为任务异步模式 (TAP)。 现在似乎是推荐的模式,它代替了异步编程模型 (APM, Begin
/ End
)和基于事件的异步模式 (EPM, Completed
, CancelAsync
等)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.