我在一个热的Observable源上有一个Selects序列,我正在尝试找出哪个正在“拖慢我的速度”(即源有一个内部缓冲区,并告诉我它必须删除项目)。而且我还想介绍“并行”完成工作的可能性(即Transform1可以在Transform2完成item(t + 1)
之前在item(t)
上开始工作)。
source.Select(a => Transform1(a))
.Select(b => Transform2(a))
.Select(c => Transform3(a))
我目前有这个,我不确定我是否会投入生产,但是至少在开发过程中会提供信息:
public static IObservable<T> Buffered<T>(this IObservable<T> source, Action<T, int> log,
IScheduler scheduler)
{
return Observable.Create<T>(ob =>
{
int count = 0;
return source
.Do(_ => Interlocked.Increment(ref count))
.Do(t => log(t, count)) //log on fill
.ObserveOn(scheduler)
.Do(_ => Interlocked.Decrement(ref count))
.Do(t => log(t, count)) //log on empty...
.Subscribe(ob);
});
}
所以我的原始代码变为:
source.Buffered((_, n) => Log($"Transform1 buffer: {n}"))
.Select(a => Transform1(a))
.Buffered((_, n) => Log($"Transform2 buffer: {n}"))
.Select(b => Transform2(a))
.Buffered((_, n) => Log($"Transform3 buffer: {n}"))
.Select(c => Transform3(a))
例如,我可以看到所有内容都在Transform2之前备份了。