2011-01-20 92 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