我正在尝试为我的WP7应用程序实现HttpWebRequest超时,因为用户可以发出请求,请求将永远不会回来,留下我在屏幕上的ProgressBar。
我看到了这个MSDN页面:msdn page
使用
ThreadPool.RegisterWaitForSingleObject (result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true);
我能够添加此代码,并链接所有变量,但当我将其添加到我的代码时,它在到达该行时会给出NotSupportedOperation
:
allDone.WaitOne();
如果我发表评论,它会在我的下一行提供相同的NotSupportedOperation
,
return _result_object;
(功能为private object SendBeginRequest()
)
如何在WP7中添加超时?这种方式似乎不起作用。由于UI线程问题,我宁愿不使用WebClient。
答案 0 :(得分:6)
如果您错过了它,allDone
应该是ManualResetEvent
,您可以传递整数毫秒或TimeSpan作为继续之前等待的时间。例如:
private ManualResetEvent _waitHandle = new ManualResetEvent(false);
private bool _timedOut;
...
this._timedOut = false;
this._waitHandle.Reset();
HttpWebRequest request = HttpWebRequest.CreateHttp("http://cloudstore.blogspot.com");
request.BeginGetResponse(this.GetResponse_Complete, request);
bool signalled = this._waitHandle.WaitOne(5);
if (false == signalled)
{
// Handle the timed out scenario.
this._timedOut = true;
}
private void GetResponse_Complete(IAsyncResult result)
{
// Process the response if we didn't time out.
if (false == this._timedOut)
{
HttpWebRequest request = (HttpWebRequest)result.AsyncState;
WebResponse response = request.EndGetResponse(result);
// Handle response.
}
}
或者,您可以使用第三方库,例如Hammock,这使得syou可以执行超时和重试尝试(以及其他内容)。根据您的项目,这可能超出您的需要,但是:)