我正在寻找有关如何使RX更容易调试的想法.当源通过组合器和节流阀以及发布等时,找到失败点可能非常困难.
到目前为止,我一直在做与复杂的Enumerable链类似的事情 - 插入Do()进行跟踪,将一个"name"字段添加到匿名类型中,有时会抓住堆栈跟踪.但是我们可能有数百个我们系统中的生产者和成千上万的消费者,并且很难分离问题.
你有什么样的技巧来调试你的RX使用?
我认为在2009年的Rx论坛上就这一主题进行了建设性的讨论.
Do您可以添加自定义日志/跟踪运算符,而不是将adhoc 运算符添加到查询中.此运算符将捕获Subscription,Disposal,OnNext,OnError和OnCompleted事件.根据您的实现,它可以只写入控制台,使用您最喜欢的Logger库,甚至可以为OS和Visual Studio集成创建ETW事件.
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(); };
});
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2495 次 |
| 最近记录: |