2012-04-13 61 views
1

使用事件中的可觀察事件,我從Web服務下載最新的天氣。我在家裏的電話和模擬器上測試了這一點,它工作正常。我帶着這個項目來工作,並在那裏使用模擬器運行它。現在我不確定它是防火牆還是防火牆,但它似乎沒有得到天氣,它只是永遠坐在那裏,嘗試。所以它讓我想到,如果這種情況發生在手機上,那麼我需要某種暫停,如果它不能在10-15秒內得到天氣,那麼就放棄。如何正確計時觀察值?

下面是示例代碼到目前爲止

IObservable<IEvent<MyWeather.GetWeatherCompletedEventArgs>> observable = 
      Observable.FromEvent<MyWeather.GetWeatherCompletedEventArgs>(Global.WeatherService, "MyWeather.GetWeatherCompleted").Take(1); 

     observable.Subscribe(w => 
     { 

      if (w.EventArgs.Error == null) 
      { 
       // Do something with the weather 
      } 
     }); 

     Global.WeatherService.GetWeatherAsync(location); 

我怎麼能在給定的時間後,得到這個時間安全撤離,如果沒有是怎麼回事?

回答

0

Observable.Timeout怎麼樣?它應該做你想要的,或者?

observable.Subscribe(w => ...).Timeout(TimeSpan.FromSeconds(10)).Catch<>(...); 
+0

我不記得我在哪裏讀過它,但我聽說使用Timeout並不是最好的選擇,因爲它會導致異常和其他問題。 – Gaz83 2012-04-13 11:26:52

1

您應該使用FromEventPattern(不FromEvent),所以我已經改變了你的觀察的到:

var observable = 
     Observable 
     .FromEventPattern<MyWeather.GetWeatherCompletedEventArgs>(
      Global.WeatherService, 
      "MyWeather.GetWeatherCompleted") 
     .Take(1); 

那麼你可以這樣做:

var timeout = 
    Observable 
     .Timer(TimeSpan.FromSeconds(10.0)) 
     .Select(_ => (EventPattern<MyWeather.GetWeatherCompletedEventArgs>)null); 

observable 
    .Amb(timeout) 
    .Subscribe(w => 
    { 
     if (w != null && w.EventArgs.Error == null) 
     { 
      // Do something with the weather 
     } 
    }); 
+0

Observable.FromEventPattern似乎只是一個選項.FromAsyncPattern,.FromAsyncPattern <>和.FromEvent <> – Gaz83 2012-04-13 11:29:14

+0

對不起,我以爲你是附加到標準事件?你得到事件的參數,對吧? – Enigmativity 2012-04-13 11:44:43

+0

如果您是在根據發件人和事件參數引用標準事件,那麼是的。 – Gaz83 2012-04-13 12:02:21