使用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);
如果没有发生任何事情,如何在给定时间后安全地超时?
答案 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)