在Rx中记录缓冲区大小

时间:2019-06-24 09:22:24

标签: c# system.reactive

我在一个热的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之前备份了。

  • 我可以俯瞰已经存在的东西吗?
  • 有更好的方法吗?

0 个答案:

没有答案