c#-在特定时间后执行操作,但是如果手动调用该操作,请重置计时器

我正在使用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’是秒:

XooooXoXoXooooXoXooooX

一切正常.我只想知道我们可以使用反应式扩展来做到这一点吗?

谢谢.

解决方法:

是的,这很容易用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是无限的.

上一篇:Akka 介绍


下一篇:我可以使用Spring 5 WebFlux WebClient使用非反应式REST API服务吗?