C#反应式扩展当OnNext花费很长时间并且可以观察到生成新事件时会发生什么

C#反应式扩展当OnNext花费很长时间并且可以观察到生成新事件时会发生什么,c#,system.reactive,reactive-programming,C#,System.reactive,Reactive Programming,我是Rx的新手,我在想,当IObservable非常快地生成大量事件时会发生什么,下一步需要很长时间。我猜新事件是以某种方式在内部排队的,这样我就可以运行内存了。我说得对吗?考虑下面的小例子: Subject<int> subject = new Subject<int>(); subject.ObserveOn(Scheduler.ThreadPool).Subscribe(x => { Console.WriteLine

我是Rx的新手,我在想,当IObservable非常快地生成大量事件时会发生什么,下一步需要很长时间。我猜新事件是以某种方式在内部排队的,这样我就可以运行内存了。我说得对吗?考虑下面的小例子:

        Subject<int> subject = new Subject<int>();
        subject.ObserveOn(Scheduler.ThreadPool).Subscribe(x => {      Console.WriteLine("Value published: {0}", x); Thread.Sleep(100); },
                     () => Console.WriteLine("Sequence Completed."));

        for (int i = 0; i < 10; i++)
        {
            subject.OnNext(i);
        }
Subject-Subject=新主题();
subject.ObserveOn(Scheduler.ThreadPool).Subscribe(x=>{Console.WriteLine(“发布的值:{0}”,x);Thread.Sleep(100);},
()=>Console.WriteLine(“序列完成”);
对于(int i=0;i<10;i++)
{
主题.OnNext(i);
}
我发布了10个事件,消费者方法非常慢。所有事件都已处理,因此必须将其缓存在内存中。如果我发布了很多事件,我的内存就会耗尽,对吗?还是我错过了什么


有没有办法限制被动扩展中挂起事件的计数?例如,如果有5个以上的挂起事件,我想省略新事件。

是的,您是对的,缓慢的消费者将导致排队。对于您所请求的内容,最接近的内置运算符是
可观察。Sample
——但是这会删除较旧的事件,而代之以较新的事件。这是更常见的要求,因为它允许你的慢观察者跟上

让我知道示例是否足够,因为您描述的缓冲行为是一个不寻常的需求—它是可以实现的,但实现起来相当复杂,并且需要相当多的代码

编辑-如果您像这样使用示例,它将在每个OnNext之后返回最新的事件(您需要提供一个调度程序使其工作),并且NewThreadScheduler会为每个订阅而不是每个事件创建一个线程:

void Main()
{
    var source = Observable.Interval(TimeSpan.FromMilliseconds(10)).Take(100);

    source.Sample(TimeSpan.Zero, NewThreadScheduler.Default)
        .Subscribe(SlowConsumer);

    Console.ReadLine();
}

private void SlowConsumer(long item)
{    
    Console.WriteLine(item + " " + Thread.CurrentThread.ManagedThreadId);
    Thread.Sleep(TimeSpan.FromSeconds(1));
}

您好,詹姆斯,谢谢您的回复。正如我看到的示例与时间有关,我更喜欢与计数有关的内容。例如:如果1000个事件排队,请停止添加新事件。或者如果1000个事件排队,请删除一些旧事件。