如何正确计时可观察量?

时间:2012-04-13 11:03:34

标签: c# windows-phone-7 system.reactive

使用observable from事件,我从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);

如果没有发生任何事情,如何在给定时间后安全地超时?

3 个答案:

答案 0 :(得分: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
        }
    });

答案 1 :(得分:0)

Observable.Timeout怎么样?它应该做你想做的,或者?

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

答案 2 :(得分:-1)