C# 创建具有固定大小或时间跨度的异步序列
下一个方法每秒调用多次,我必须在大量事件到达或时间跨度已过时通知订户:C# 创建具有固定大小或时间跨度的异步序列,c#,.net,system.reactive,observer-pattern,C#,.net,System.reactive,Observer Pattern,下一个方法每秒调用多次,我必须在大量事件到达或时间跨度已过时通知订户: public async Task SendEventsAsync(IEnumerable<Event> events) { foreach(var event in events) { // Notify my subscriber } } 这段代码创建了一个具有恒定时间间隔的无限序列,然后被投影到一个具有固定大小和最大延迟时间的缓冲区,类似于我正在寻找的东西。但是我的
public async Task SendEventsAsync(IEnumerable<Event> events)
{
foreach(var event in events)
{
// Notify my subscriber
}
}
这段代码创建了一个具有恒定时间间隔的无限序列,然后被投影到一个具有固定大小和最大延迟时间的缓冲区,类似于我正在寻找的东西。但是我的序列应该是从我的方法中馈送的,而不是固定的时间间隔
我不知道我的片段应该如何组合在一起,我需要创建什么样的可观察序列。或者我把注意力错误地放在了这个问题上
有间隔和静态计数器的序列就足够了吗?我想你的想法是对的。我假设你有这样的结构:
public class EventNotification { }
public class SingletonThing
{
//don't need async for Rx
public void SendEventsAsync(IEnumerable<EventNotification> events)
{
foreach (var element in events)
{
}
}
}
然后将按如下方式调用订阅代码:
SingletonThing.BatchedEvents.Subscribe(buffer =>
Console.WriteLine("Buffer of {1} @ {0}", DateTime.Now, buffer.Count)
);
SendEventsAsync{}返回任务。返回的任务何时完成?例如,如果为批量交付保存1000个事件,那么所有1000个任务会立即完成,还是在事件实际交付时立即完成。我不叫这个方法。这是一份有框架的合同。框架调用此方法来通知我事件。实际上,这个方法的参数是一个IEnumerable,它在调用这个方法之前形成了自己的批,但是我简化了它,因为我不想混合我的这些批,这一点没有被很好地理解。我编辑了我的帖子来展示它代码>工作?事件参数没有我的批处理所需的大小。也没有我想要的频率。这正是我想要的。我试过了,效果很好。
public class SingletonThing
{
private readonly Subject<EventNotification> _subject = new Subject<EventNotification>();
public void SendEventsAsync(IEnumerable<EventNotification> events)
{
foreach (var element in events)
{
_subject.OnNext(element);
}
}
//not necessary to expose, but could be helpful
public IObservable<EventNotification> AllEvents => _subject.AsObservable();
private int idealBatchSize = 10000;
private TimeSpan maxTimeDelay = TimeSpan.FromSeconds(60);
public IObservable<IList<EventNotification>> BatchedEvents => _subject
.Buffer(maxTimeDelay, idealBatchSize);
}
SingletonThing.BatchedEvents.Subscribe(buffer =>
Console.WriteLine("Buffer of {1} @ {0}", DateTime.Now, buffer.Count)
);