我在C#中有一个方法可以运行,然后等一下再重新启动方法.
现在,我正在使用
while(true) { this.DoMyMethod(); Thread.Sleep(TimeSpan.FromMinutes(1)); }
虽然这有效,但我想知道是否有更优雅的方式来做到这一点?计时器的问题是,即使最后一次定时器点火呼叫尚未完成,它们也会运行.
所以做一个异步循环:
public async Task DoMyThing(CancellationToken token = default(CancellationToken)) { while(!token.IsCancellationRequested) { this.DoMyMethod(); try { await Task.Delay(TimeSpan.FromMinutes(1), token); } catch(TaskCanceledException) { break; } } }
保证此代码不会与调用重叠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 }