繁体   English   中英

在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>对象,并使用诸如WaitContinueWith等方法……比处理Begin / End (APM模式)要容易得多。

FWIW *Async模式称为任务异步模式 (TAP)。 现在似乎是推荐的模式,它代替了异步编程模型 (APM, Begin / End )和基于事件的异步模式 (EPM, CompletedCancelAsync等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM