我在C#中有一个方法可以运行,然后等一下再重新启动方法.
现在,我正在使用
while(true)
{
this.DoMyMethod();
Thread.Sleep(TimeSpan.FromMinutes(1));
}
Run Code Online (Sandbox Code Playgroud)
虽然这有效,但我想知道是否有更优雅的方式来做到这一点?计时器的问题是,即使最后一次定时器点火呼叫尚未完成,它们也会运行.
所以做一个异步循环:
public async Task DoMyThing(CancellationToken token = default(CancellationToken))
{
while(!token.IsCancellationRequested)
{
this.DoMyMethod();
try
{
await Task.Delay(TimeSpan.FromMinutes(1), token);
}
catch(TaskCanceledException)
{
break;
}
}
}
Run Code Online (Sandbox Code Playgroud)
保证此代码不会与调用重叠DoMyMethod,因此在调用之间Thread.Sleep会发生延迟(很多以相同的方式).
如果你创建一个CancellationTokenSource,你可以通过它Token来你的方法,你可以通过调用杀死环Cancel上CancellationTokenSource.
注意: CancellationToken.None === default(CancellationToken)
随着System.Timers.Timer您可以设置AutoReset到false这意味着计时器将只运行一次,你就必须调用Start()再次重新启动它。
因此,在您的计时器滴答方法中,只需Start()在完成所需的操作后调用,您就可以重新开始了。
例如:
public SomeClass()
{
Timer timer = new Timer(60000);
timer.Elapsed += new ElapsedEventHandler(OnElapsed);
timer.AutoReset = false;
timer.Start();
}
private void OnElapsed(object sender, ElapsedEventArgs e)
{
// Do stuff
timer.Start(); // Restart timer
}
Run Code Online (Sandbox Code Playgroud)