Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在特定时间后执行操作,但如果手动调用,请重置计时器_C#_Timer_System.reactive_Reactive - Fatal编程技术网

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另请参见相关内容: