[英]RX: How to process n buffered items from a sequence then wait t seconds before processing the next n items?
我试图弄清楚如何从一个序列中处理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一样被延迟了!
如果您不希望将列表元素弄平,请以克里斯托弗的答案为基础,可以这样做:
var delay = Observable.Empty<IList<int>>().Delay(TimeSpan.FromSeconds(10));
var query = Observable.Range(0, 100000)
.Buffer(20)
.Select(batch => Observable.Return(batch).Concat(delay))
.Concat();
query.Subscribe(list =>
{
Console.WriteLine(DateTime.Now);
foreach (var value in list)
{
Console.WriteLine(value);
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.