Ответ 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(); };
});
}
}