Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 创建具有固定大小或时间跨度的异步序列_C#_.net_System.reactive_Observer Pattern - Fatal编程技术网

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)
);