在特定时间后执行操作,但如果手动调用,则重置计时器

时间:2017-07-23 16:49:44

标签: c# timer system.reactive reactive

我使用System.Timers.Timer每10秒执行一次动作。如果出现某些特殊情况或通过UI,也可以通过其他方法调用此操作。如果未从计时器调用该操作,我只需重置计时器。

我正在使用的代码......

timer = new Timer();
timer.Elapsed += (sender, args) => ExecuteAction();
timer.Interval = 10000;
timer.Enabled = true;

public void ExecuteActionAndResetTimer()
{
    ExecuteAction();

    timer.Stop();
    timer.Start();
}

private void ExecuteAction()
{
    // do the work...
}

预期结果,如果'X'是从计时器调用的动作(即ExecuteAction),' X '是从外部计时器调用的动作(即ExecuteActionAndResetTimer)和'o'是第二个:

XooooXo的 X 0的 X ooooXo的 X ooooX

这很好用。我只是想知道我们可以使用反应式扩展吗?

感谢。

1 个答案:

答案 0 :(得分:4)

是的,使用Rx很容易做到这一点。

以下是:

var subject = new Subject<char>();

var query =
    subject
        .StartWith('X')
        .Select(c =>
            Observable
                .Interval(TimeSpan.FromSeconds(10.0))
                .Select(n => 'X')
                .StartWith(c))
        .Switch();

query.Subscribe(x => Console.Write(x));

Thread.Sleep(5000);
subject.OnNext('Q');
Thread.Sleep(15000);
subject.OnNext('W');

生成序列XQXWXXXX,最终X为无限广告。