在特定时间后执行动作,但如果手动调用,则重置计时器
Execute an action after a specific time, but if it is called manually, reset the timer
我正在使用 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
会无限循环。
我正在使用 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
会无限循环。