2011-11-22 12 views
24

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 publicas, y tal.Trucos para la depuración con extensiones reactivas?

Hasta ahora he estado haciendo cosas similares a lo que hago con cadenas Enumerable complicadas - insertando Do() para el seguimiento, agregando un campo "nombre" a un tipo anónimo en parte, agarrando rastros de pila a veces .. Pero quizás tengamos cientos de productores y tal vez miles de consumidores en nuestro sistema y cada vez es más difícil aislar los problemas.

¿Qué tipo de trucos tiene para depurar su uso de RX?

+2

Gran pregunta. Siempre estoy luchando para depurar mi código Rx. – Tim

+7

Estoy totalmente en desacuerdo con que casperOne haya cerrado casualmente esta pregunta. Estoy buscando experiencia en una tecnología muy específica. Es probable que esta pregunta * no * resulte en "opinión, debate, argumentos, encuestas o discusiones extensas". – scobi

+1

¿No es constructivo? Tal vez la pregunta no sea lo suficientemente específica, pero es una pregunta muy valiosa. Oh, bueno, volvamos a las preguntas de "por qué no compila este código". –

Respuesta

7

creo que un constructive discussion sobre este tema se ha tenido en los foros de Rx en 2009.

en lugar de añadir ad hoc Do operadores en sus consultas, deberá añadir un operador de registro personalizado/Trace. 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 Logger favorita o incluso crear eventos ETW para la integración de OS 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(); }; 
     }); 
    } 
} 
+0

Pruebe esto + Seq http://www.lavinski.me/debugging-rx-with-seq/ –

11

Un truco importante para la captura de insectos Rx es para volver a intentar la depuración con excepciones de primera oportunidad habilitados, esto hace que sea mucho más probable que usted obtendrá un mensaje de excepción real en lugar de un relanza uno:

+0

Siempre me sorprende cuando las personas no corren con excepciones establecidas para aprovechar la primera oportunidad. Es como volar a ciegas. – scobi

+0

Rx a menudo dependen del tiempo, por lo que no es una opción. Los rastros se utilizan en la depuración sensible al tiempo. –

+0

Aclarando, esta pantalla está disponible en Depurar> Excepciones (no en Opciones). https://msdn.microsoft.com/en-us/library/d14azbfh.aspx –

Cuestiones relacionadas