2012-04-13 63 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