0

我有一个要移植到 Windows 8 Store 类库的类库。其中一种方法使用现在不支持的同步 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 启动的任何线程吗?

4

1 回答 1

1

怎么样:

if(false == request.GetResponseAsync().Wait(DateTime.Now.AddMinutes(2.0)))
{
    Trace.WriteLine("timeout");
    return;
}
//...

现在请记住,这只是等待异步操作的超时。要专门处理响应/请求流操作的超时,请参阅HttpWebRequest.Timeout

您不必使用async/ awaitwith*Async方法。它们只是返回一个Task<T>您可以使用的对象并使用诸如Wait,ContinueWith等方法...比处理Begin/ End(APM 模式)容易得多...

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

于 2012-08-21T20:46:22.100 回答