簡體   English   中英

如何正確計時可觀察物?

[英]How do I correctly timing out an 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);

如果什么都沒發生,如何在給定時間后安全超時?

您應該使用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
        }
    });

Observable.Timeout怎么樣? 它應該做您想要的,還是?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM