gpt4 book ai didi

c# - RX : How to process n buffered items from a sequence then wait t seconds before processing the next n items?

转载 作者:行者123 更新时间:2023-11-30 20:50:12 24 4
gpt4 key购买 nike

我想弄清楚如何处理序列中的 n 个缓冲项目,然后等待 t 秒再处理下 n 个项目?

这是我尝试使用 Thread.Sleep() 进行的粗略形式。我想避免 Thread.Sleep() 并正确执行。

static void Main(string[] args)
{
var t = Observable.Range(0, 100000);

var query = t.Buffer(20);

query.ObserveOn(NewThreadScheduler.Default)
.Subscribe(x => DoStuff(x));

Console.WriteLine("Press ENTER to exit");
Console.ReadLine();

}

static void DoStuff(IList<int> list)
{
Console.WriteLine(DateTime.Now);

foreach (var value in list)
{
Console.WriteLine(value);
}

Thread.Sleep(TimeSpan.FromSeconds(10));
}

任何人都可以帮我找到一种更多的 RX 方法吗?

谢谢

闪光灯

最佳答案

// Instantiate this once, we'll use it in a closure multiple times.
var delay = Observable.Empty<int>().Delay(TimeSpan.FromMilliseconds(10));

// start with a source of individual items to be worked.
Observable.Range(0, 100000)
// Create batches of work.
.Buffer(20)
// Select an observable for the batch of work, and concat a delay.
.Select(batch => batch.ToObservable().Concat(delay))
// Concat those together and form a "process, delay, repeat" observable.
.Concat()
// Subscribe!
.Subscribe(Console.WriteLine);

// Make sure we wait for our work to be done.
// There are other ways to sync up, like async / await.
Console.ReadLine();

或者,您也可以使用 async/await 进行同步:

static IObservable<int> delay = Observable.Empty<int>().Delay(TimeSpan.FromMilliseconds(100));

static async Task Run()
{
await Observable.Range(0, 1000)
.Buffer(20)
.Select(batch => batch.ToObservable().Concat(delay))
.Concat()
.Do(Console.WriteLine)
.LastOrDefaultAsync();
}

可观察到的 delay 不是一个绝妙的技巧吗?它之所以有效,是因为 OnCompleted 像 OnNext 一样被延迟了!

关于c# - RX : How to process n buffered items from a sequence then wait t seconds before processing the next n items?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22738436/

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