1

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

如果什么都没有发生,我怎样才能让这个在给定时间后安全超时?

4

3 回答 3

1

你应该使用FromEventPattern(not FromEvent) 所以我将你的 observable 更改为:

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
        }
    });
于 2012-04-13T11:19:35.627 回答
0

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

observable.Subscribe(w => ...).Timeout(TimeSpan.FromSeconds(10)).Catch<>(...);
于 2012-04-13T11:17:41.407 回答
-2

尝试在 C# 中使用 Latch

http://www.itdevspace.com/2009/05/c-latch-implementation.html

于 2012-04-13T13:23:24.780 回答