从 IObservable 获取,直到收集达到计数或经过的时间



我想填充一个集合,直到满足这两个条件中的任何一个:

  • 允许的 5 秒时间已完成,或者
  • 收藏达到 5 件。

如果满足这些条件中的任何一个,则应执行我订阅的方法(在本例中为 Console.WriteLine)

    static void Main(string[] args)
    {
        var sourceCollection = Source().ToObservable();
        var bufferedCollection = sourceCollection.Buffer(
            () => Observable.Amb(
                    Observable.Timer(TimeSpan.FromSeconds(5)//,
                    //Observable.TakeWhile(bufferedCollection, a=> a.Count < 5)
                ))
            );
            bufferedCollection.Subscribe(col => 
                {
                    Console.WriteLine("count of items is now {0}", col.Count);
                });
        Console.ReadLine();
    }
    static IEnumerable<int> Source()
    {
        var random = new Random();
        var lst = new List<int> { 1,2,3,4,5 };
        while(true)
        {
            yield return lst[random.Next(lst.Count)];
            Thread.Sleep(random.Next(0, 1500));
        }
    }

我设法让它与 Observable.timer 一起使用,但 TakeWhile 不起作用,我如何检查集合计数,TakeWhile 是否适用于此或有其他方法?我确定这很简单。

我明白了,答案在 Buffer 的文档中 - 有一个重载,它采用指定最大计数的参数。所以我不需要Observable.Amb,我可以说

       var sourceCollection = Source().ToObservable();
        var maxBufferCount = 5;
        var bufferedCollection = sourceCollection.Buffer(TimeSpan.FromSeconds(5), maxBufferCount, Scheduler.Default);
        bufferedCollection.Subscribe(col => 
                {
                    Console.WriteLine("count of items is now {0}", col.Count);
                });
        Console.ReadLine();

相关内容

  • 没有找到相关文章

最新更新