C#反应式扩展当OnNext花费很长时间并且可以观察到生成新事件时会发生什么
我是Rx的新手,我在想,当IObservable非常快地生成大量事件时会发生什么,下一步需要很长时间。我猜新事件是以某种方式在内部排队的,这样我就可以运行内存了。我说得对吗?考虑下面的小例子: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
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个事件排队,请删除一些旧事件。