2011-01-20 69 views
5

我试图为我的WP7应用程序实现一个HttpWebRequest超时,因为用户可以发出请求,并且请求永远不会回来,从而在屏幕上留下ProgressBar。WP7中的HttpWebRequest超时

我看到这个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。

回答

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做超时和重试次数(除其他事项外)。根据您的项目,这可能超过您的需要,虽然:)

+0

这很好,谢谢! – 2011-01-20 18:13:10