什么是在c#中使用具有单个并发执行限制的Rx运行周期性任务的好方法?我希望运行周期性任务,限制在任何给定时间最多执行一次方法。我正在尝试使用Rx,但我不确定最多如何施加并发限制。vartimer=Observable.Interval(TimeSpan.FromMilliseconds(100));timer.Subscribe(tick=>DoSomething());另外,如果任务仍在运行,我希望后续计划能够通过。即我不希望任务排队并导致问题。我有2个这样的任务会定期执行。正在执行的任务当前是同步的。但是,如有必要,我可以使它们异步。你应该按原样测试你的代码,因为这是Rx强加的。试试这个作为测试:voidMain(){vartimer=Observable.Interval(TimeSpan.FromMilliseconds(100));使用(timer.Do(x=>Console.WriteLine("!")).Subscribe(tick=>DoSomething())){Console.ReadLine();}}privatevoidDoSomething(){Console.Write("");当你运行它时,你会得到这样的输出:!<16:54:57.111>!<16:54:58.112>!<16:54:59.113>!<16:55:00.113>!<16:55:01.114>!<16:55:02.115>!<16:55:03.116>!<16:55:04.117>!<16:55:05.118>!<16:55:06.119已经保证没有重叠。你在正确的轨道上,你可以使用Select+Concat来展平observable并限制飞行请求的数量(注意:如果你的任务花费的时间比间隔时间长,那么它们将开始堆叠,因为它们执行得不够快):varsource=Observable.Interval(TimeSpan.FromMilliseconds(100))//我假设你正在做异步工作,因为你想限制并发.Select(_=>Observable.FromAsync(()=>DoSomethingAsync()))//这相当于调用Merge(1).Concat();source.Subscribe(/*处理每个操作的结果*/);这是一个完全符合您要求的工厂函数。publicstaticIObservablePeriodic(TimeSpantimeSpan){returnObservable.Return(Unit.Default).Concat(Observable.Return(Unit.Default).Delay(timeSpan).Repeat());这是Periodic(TimeSpan.FromSeconds(1)).Subscribe(x=>{Console.WriteLine(DateTime.Now.ToString("mm:ss:fff"));Thread.Sleep(500);的示例用法});如果你运行它,每个控件的打印间隔大约为1.5秒。请注意,如果您不希望第一个滴答立即运行,您可以使用此工厂在时间跨度之后才发送第一个单位。C#学习教程就是这样:使用具有单个并发执行限制的Rx在c#中运行周期性任务的好方法是什么?如果分享的内容对你有用,需要了解更多C#学习教程,希望你多多关注——).重复();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
