2011-01-20 2 views
5

Я пытаюсь реализовать тайм-аут HttpWebRequest для своего приложения WP7, так как пользователь может сделать запрос, и запрос никогда не вернется, оставив на экране ProgressBar.HttpWebRequest Timeout в WP7

Я видел эту страницу MSDN: msdn page

который использует

ThreadPool.RegisterWaitForSingleObject (result.AsyncWaitHandle, new WaitOrTimerCallback(TimeoutCallback), myHttpWebRequest, DefaultTimeout, true); 

я смог добавить этот код, и связать все переменные, но когда я добавляю его в мой код, это дает NotSupportedOperation при получении линии:

allDone.WaitOne(); 

Если я закомментировать, это дает тот же NotSupportedOperation на моей следующей строке,

return _result_object; (функция private object SendBeginRequest())

Как добавить тайм-аут в WP7? Этот способ, похоже, не работает. Я бы предпочел не использовать 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

Это сработало отлично, спасибо! –

Смежные вопросы