【问题标题】:Run with interval until condition or a certain time elapsed以间隔运行,直到条件或经过一定时间
【发布时间】:2018-01-02 00:55:27
【问题描述】:

我需要写一段代码是:

  1. 在每个配置的时间间隔运行
  2. 在一定时间后或满足条件后停止。

我发现我可以将 TaskCancellationToken 一起使用,但我看不到任何选项可以在一段时间内一次又一次地运行它。

我看到的另一个选项是使用System.Threading.Timer - 但如果满足条件,我将无法取消该过程。

有人可以提出一个优雅的解决方案吗?

【问题讨论】:

  • 你可以在定时器触发后检查条件(第一个动作),如果需要跳过处理。
  • 正在寻找 Timer.Enabled 属性?还是在循环内带有 Task.Delay() 的任务中的 while 语句?任务更容易可靠地停止。

标签: c# multithreading


【解决方案1】:

您可以使用Reactive Extensions 轻松做到这一点:

int maxDurationInseconds = 5;
bool condition = true;

var timer = Observable.Interval(TimeSpan.FromSeconds(1))
    .TakeWhile(i => i <= maxDurationInseconds)
    .TakeWhile(i => condition)
    .Subscribe(i => 
    {
        Console.WriteLine(i);
    });

Console.ReadLine();     

timer.Dispose();

上面的代码将显示经过的秒数,直到达到阈值或条件变为 false。 i 表示经过的秒数。

可以在here 找到一个很好的 Rx 参考。或者看看GitHub repo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-26
    • 1970-01-01
    • 2013-08-04
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    相关资源
    最近更新 更多