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

时间:2015-01-18 14:12:17

标签: c# system.reactive

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

  • 允许的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是否适用于此或是否有其他方法?我确定它简单。

1 个答案:

答案 0 :(得分:0)

我知道了,答案是在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();