Можно ли добавить пользовательское сообщение в оператор Rx.Net Timeout

Я пытаюсь прочитать поток данных с устройства и найти в нем действительные данные. Это набор нулей с некоторыми данными между ними. Что-то типа:

0,0,0,1,2,3,2,1,0,0,0,0,1,2,3,2,1,0,0,0 и так далее.

То, что выдается после обработки, представляет собой сумму группы ненулевых данных, например.

9,9

У меня есть два оператора тайм-аута в моем коде. И, к сожалению, оба они имеют одно и то же сообщение:

System.TimeoutException: The operation has timed out.

Поэтому я не могу предоставить пользователю больше контекста, как если бы произошла ошибка, например. Поток данных замолчал или У нас есть поток данных, но мы получаем только нули.

Есть ли способ добавить свое собственное сообщение, а не обычное сообщение TimeoutException?

Вот мой псевдокод:

var _handle = 
        _source.Select(x => x.Item1)
        .Timeout(TimeSpan.FromSeconds(5)) // If the stream goes silent here the timeout is raised.
        .EmitSumOfDataNonZeroPoints()
        .Timeout(TimeSpan.FromSeconds(15)) // If no valid group of nonzero data is found the timeout is raised.
        .Subscribe(
            someProcessing => {},
            ex => {
                _errorInObservableMessage = ex.Message;
            },
            () => {}
        );

person NotAgain says Reinstate Monica    schedule 15.07.2020    source источник


Ответы (1)


У оператора Timeout есть перегрузка, в которой вы можете передать наблюдаемую other, которая будет продолжаться в случае тайм-аута:

// Applies a timeout policy for each element in the observable sequence. If the
// next element isn't received within the specified timeout duration starting from
// its predecessor, the other observable sequence is used to produce future messages
// from that point on.
public static IObservable<TSource> Timeout<TSource>(this IObservable<TSource> source,
    TimeSpan dueTime, IObservable<TSource> other);

Вы можете использовать эту перегрузку напрямую или использовать ее как строительный блок пользовательского оператора Timeout, который принимает аргумент timeoutMessage:

/// <summary>In case of timeout propagates a TimeoutException with custom message.</summary>
public static IObservable<TSource> Timeout<TSource>(
    this IObservable<TSource> source, TimeSpan dueTime, string timeoutMessage)
{
    return source.Timeout(dueTime,
        Observable.Throw<TSource>(new TimeoutException(timeoutMessage)));
}
person Theodor Zoulias    schedule 15.07.2020
comment
Спасибо. Оно работает. Подождет день, прежде чем принять его в качестве ответа. - person NotAgain says Reinstate Monica; 15.07.2020