当前位置:  开发笔记 > 编程语言 > 正文

大约每分钟运行一次任务而不使用Thread.Sleep

如何解决《大约每分钟运行一次任务而不使用Thread.Sleep》经验,为你挑选了2个好方法。

我在C#中有一个方法可以运行,然后等一下再重新启动方法.

现在,我正在使用

while(true)
{
    this.DoMyMethod();

    Thread.Sleep(TimeSpan.FromMinutes(1));
}

虽然这有效,但我想知道是否有更优雅的方式来做到这一点?计时器的问题是,即使最后一次定时器点火呼叫尚未完成,它们也会运行.



1> spender..:

所以做一个异步循环:

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来你的方法,你可以通过调用杀死环CancelCancellationTokenSource.

注意: CancellationToken.None === default(CancellationToken)



2> Lloyd..:

随着System.Timers.Timer您可以设置AutoResetfalse这意味着计时器将只运行一次,你就必须调用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
}

推荐阅读
凹凸曼00威威_694
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有