gpt4 book ai didi

c# - RX - 可观察序列中元素的组/批突发

转载 作者:太空狗 更新时间:2023-10-29 23:06:45 25 4
gpt4 key购买 nike

我有一个可观察的序列。当插入第一个元素时,我想启动一个计时器并在计时器的时间跨度内批量处理后续插入的元素。然后,在序列中插入另一个元素之前,计时器不会再次启动。

所以像这样:

--------|=====timespan====|---------------|=====timespan====|-------------->
1 2 3 4 5 6 7 8

会产生:

[1,2,3,4,5], [6,7,8] 

我尝试使用 Observable.Buffer() 和一个时间跨度,但从我的实验来看,我可以看到一旦我们订阅可观察序列,计时器就会启动,并在前一个计时器完成后立即重新启动。

因此,使用与前面示例相同的序列并使用带时间跨度的 Buffer(),我会得到类似这样的结果:

|=====timespan====|=====timespan====|=====timespan====|=====timespan====|-->
1 2 3 4 5 6 7 8

这会产生这个:

[1,2,3,4], [5], [6,7], [8]

以下是我如何使用缓冲区测试此行为:

var source = Observable.Concat(Observable.Timer(TimeSpan.FromSeconds(6)).Select(o => 1),
Observable.Timer(TimeSpan.FromSeconds(1)).Select(o => 2),
Observable.Timer(TimeSpan.FromSeconds(3)).Select(o => 3),
Observable.Never<int>());

Console.WriteLine("{0} => Started", DateTime.Now);
source.Buffer(TimeSpan.FromSeconds(4))
.Subscribe(i => Console.WriteLine("{0} => [{1}]", DateTime.Now, string.Join(",", i)));

输出:

4/24/2015 7:01:09 PM => Started
4/24/2015 7:01:13 PM => []
4/24/2015 7:01:17 PM => [1,2]
4/24/2015 7:01:21 PM => [3]
4/24/2015 7:01:25 PM => []
4/24/2015 7:01:29 PM => []
4/24/2015 7:01:33 PM => []

有人知道如何做到这一点吗?提前致谢!

最佳答案

试一试:

var source = Observable.Concat(Observable.Timer(TimeSpan.FromSeconds(6)).Select(o => 1),
Observable.Timer(TimeSpan.FromSeconds(1)).Select(o => 2),
Observable.Timer(TimeSpan.FromSeconds(4)).Select(o => 3),
Observable.Never<int>());

Console.WriteLine("{0} => Started", DateTime.Now);
source
.GroupByUntil(x => 1, g => Observable.Timer(TimeSpan.FromSeconds(4)))
.Select(x => x.ToArray())
.Switch()
.Subscribe(i => Console.WriteLine("{0} => [{1}]", DateTime.Now, string.Join(",", i)));

我不得不更改第三个计时器的测试代码持续时间,以确保该值在分组计时器之外。

关于c# - RX - 可观察序列中元素的组/批突发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29858974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com