0

我想知道在超时触发之前获取序列中最新元素的最佳方法是什么?

我有一个不时 ping 远程服务的代码,我希望能够识别一个已脱机的服务。

使用超时扩展我想出了这个:

heartbeatResponseObservable.Timeout(Timeout, Observable.Return(new HeartbeatBusMessage.Timeout()))

这有点工作,但它不允许我找到哪个服务已经消失。我想要的是 Timeout 扩展,其中包含流中的最新消息作为参数,以在它产生的错误消息中提供一些信息。

如何在 Timeout 扩展中获取最新的序列元素?

4

1 回答 1

1
public static IObservable<T> TimeOutExtension<T>(
    this IObservable<T> source, 
    TimeSpan timeSpan)
{
    // On Timeout complete with an empty Observable.
    var completeOnTimeout = source
                                .Timeout(timeSpan)
                                .Catch<T, TimeoutException>(ex => Observable.Empty<T>());

    // Join the source w/ the empty Observable created on timeout.
    var beforeTimeout =
        source.Join(completeOnTimeout, 
        _ => source, 
        _ => completeOnTimeout, 
        (s, c) => s);

    // Return last
    return beforeTimeout.LastAsync();
}

可以这样使用:

// Create 10 events quickly, then once every two seconds.
var source =
    Observable.Interval(TimeSpan.FromMilliseconds(100))
        .Take(10)
        .Concat(Observable.Interval(TimeSpan.FromSeconds(2)));

// Set a timeout of 1 second.
var last = source.TimeOutExtension(TimeSpan.FromSeconds(1));

last.Subscribe(Console.WriteLine); // outputs 9
于 2015-09-25T17:33:16.917 回答