C# 在特定时间后执行操作,但如果手动调用,请重置计时器
我使用C# 在特定时间后执行操作,但如果手动调用,请重置计时器,c#,timer,system.reactive,reactive,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 ExecuteActionAn
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”是从外部计时器调用的操作(即ExecuteAction和settimer
),且“o”是秒:
xoooxoXoXooooXoXoox
这很好用。我只是想知道,我们可以使用反应式扩展来实现这一点吗
谢谢。是的,使用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');
var subject=new subject();
变量查询=
主题
.StartWith('X')
.选择(c=>
可观察
.间隔(时间跨度从秒(10.0))
.选择(n=>X')
.StartWith(c))
.开关();
query.Subscribe(x=>Console.Write(x));
睡眠(5000);
subject.OnNext('Q');
睡眠(15000);
subject.OnNext('W');
这将生成序列
XQXWXXXX
,最后的X
s将无限期地进行。如果将间隔设置为每2秒一次,并将Q移动到9秒,您将看到在Q之前只触发一个X,而不是4个。换句话说,在一个X被激发之后,另一个X直到Q被激发才被激发。我希望我说的有道理。虽然投票率很高,因为这很接近。@Yogesh-是的,你是对的。我需要触发目标的第一次发射。我会修好的。@Yogesh-修好了。我只需要将.StartWith('X')
移动到之前。选择(…)
@Yogesh-我同意你的看法。如果我是你,我会安装。它有很多Rx样本,是编写代码的好地方。我现在大部分的代码都在那里。完全值得支付正式许可证费用。@Yogesh另请参见相关内容: