C# 如何正确地对可观察到的时间进行计时?

C# 如何正确地对可观察到的时间进行计时?,c#,windows-phone-7,system.reactive,C#,Windows Phone 7,System.reactive,使用一个可观测的from事件,我从web服务下载了最新的天气。我在家里的手机和模拟器上进行了测试,效果很好。我带着这个项目去工作,并在那里使用模拟器运行它。现在我不确定它是防火墙还是什么,但它似乎不了解天气,它只是永远坐在那里,尝试。所以,这让我想到,如果这是发生在手机上,那么我需要某种超时,如果它不能在10-15秒内得到天气,那么就放弃吧 下面是到目前为止的示例代码 IObservable<IEvent<MyWeather.GetWeatherCompletedEventArgs&

使用一个可观测的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);
i可观察=
可观测的.FromEvent(Global.WeatherService,“MyWeather.GetWeatherCompleted”)。取(1);
可观察。订阅(w=>
{
if(w.EventArgs.Error==null)
{
//对天气做些什么
}
});
Global.WeatherService.GetWeatherAsync(位置);
如果没有任何事情发生,我如何在给定的时间后让它安全超时?

怎么样?它应该做你想做的,还是

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

您应该使用
FromEventPattern
(而不是
FromEvent
),因此我将您的observable更改为:

var observable =
      Observable
        .FromEventPattern<MyWeather.GetWeatherCompletedEventArgs>(
            Global.WeatherService, 
            "MyWeather.GetWeatherCompleted")
        .Take(1);
var可观测=
可观察
.FromEventPattern(
环球天气服务,
“MyWeather.GetWeatherCompleted”)
.采取(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
        }
    });
var超时=
可观察
.计时器(时间跨度从秒(10.0))
.Select(=>(EventPattern)null);
可观察
.Amb(超时)
.订阅(w=>
{
如果(w!=null&&w.EventArgs.Error==null)
{
//对天气做些什么
}
});
尝试在C中使用闩锁#


我不记得在哪里读过它,但我听说使用超时不是最好的选择,因为它会导致异常和其他问题。Observable.FromEventPattern似乎不是唯一的选项。FromAsyncPattern、.FromAsyncPattern和.FromEvent抱歉,我以为你在附加标准事件?您得到的是事件参数,对吗?如果您引用的是基于发件人和事件参数的标准事件,则是。您的意思是用于调试吗?我看不出这有什么用处。强烈不建议这样做。如果必须,请使用第三方物流。