system.reactive

system.reactive - ¿Trucos para depurar con extensiones reactivas?



(2)

Creo que se ha tenido una discusión constructiva sobre este tema en los foros de Rx en 2009.

En lugar de agregar operadores Do adhoc en sus consultas, agregaría un operador Log / Trace personalizado. Este operador capturaría los eventos de suscripción, eliminación, OnNext, OnError y OnCompleted. Dependiendo de su implementación, podría simplemente escribir en la consola, usar su biblioteca de Logger favorita o incluso crear eventos ETW para la integración del sistema operativo y 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(); }; }); } }

Estoy buscando ideas sobre cómo hacer que RX sea más fácil de depurar. Puede ser muy difícil encontrar el punto de falla cuando una fuente pasa a través de combinadores y aceleradores y publica y tal.

Hasta ahora he estado haciendo cosas similares a las que hago con cadenas Enumerables complicadas: insertar Do () para el rastreo, agregar un campo de "nombre" a un tipo anónimo a la mitad del camino, capturar rastreos de pila a veces ... Pero quizás tenemos cientos de productores y tal vez miles de consumidores en nuestro sistema y se está haciendo muy difícil aislar los problemas.

¿Qué tipo de trucos tienes para depurar tu uso de RX?


Un truco importante para detectar los errores de Rx es volver a intentar la depuración con las excepciones de primera oportunidad habilitadas, esto hace que sea más probable que reciba un mensaje de excepción real en lugar de uno nuevo: