Подтвердить что ты не робот

Трюки для отладки с реактивными расширениями?

Я ищу идеи о том, как сделать RX более легко отлаживаемой. Это может быть очень трудно найти точку отказа, когда источник передается через комбайнеры и дроссели и публикует и т.д.

До сих пор я делал похожие вещи с тем, что я делаю со сложными цепочками Enumerable, вставляя Do() для трассировки, добавляя поле "имя" к части анонимного типа, иногда захватывая трассировку стека. Но мы возможно, сотни производителей и, возможно, тысячи потребителей в нашей системе, и очень сложно изолировать проблемы.

Какие трюки у вас есть для отладки вашего использования RX?

4b9b3361

Ответ 1

Я думаю, что конструктивное обсуждение по этой теме было опубликовано на форумах Rx в 2009 году.

Вместо добавления в ваши запросы операторов adhoc Do вы должны добавить пользовательский оператор Log/Trace. Этот оператор будет захватывать события Subscription, Disposal, OnNext, OnError и OnCompleted. В зависимости от вашей реализации он может просто писать на консоль, использовать вашу любимую библиотеку Logger или даже создавать события ETW для интеграции ОС и Visual Studio.

public static class ObservableTrace
{
    public static IObservable<TSource> Trace<TSource>(this IObservable<TSource> source, string name)
    {
        int id = 0;
        return Observable.Create<TSource>(observer => 
        {
            int id1 = ++id;
            Action<string, object> trace = (m, v) => Debug.WriteLine("{0}{1}: {2}({3})", name, id1, m, v);
            trace("Subscribe", "");
            IDisposable disposable = source.Subscribe(
                v => { trace("OnNext", v); observer.OnNext(v); },
                e => { trace("OnError", ""); observer.OnError(e); },
                () => { trace("OnCompleted", ""); observer.OnCompleted(); });
            return () => { trace("Dispose", ""); disposable.Dispose(); };
        });
    }
}

Ответ 2

Одним из важных трюков для поиска Rx-ошибок является повторная отладка с включенными исключениями с первым шансом, поэтому вероятность того, что вы получите реальное сообщение об исключении, а не восстановленное: