c# - 在不使用 Thread.Sleep 的情况下大约每分钟运行一次任务

标签 c# timer

我有一个要运行的 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)

关于c# - 在不使用 Thread.Sleep 的情况下大约每分钟运行一次任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34073613/

相关文章:

C# 在父构造函数中访问调用者

Java Swing - 调用paintComponent 未清除JPanel?

c# Environment.ProcessorCount 并不总是返回逻辑处理器的完整数量,为什么?

c# - 使用 x509 证书签署 xml 文档

Android 应用程序上的 Java 计时器

Javascript - 如何使滚动条仅在将鼠标移动到相应 div 内时可见

c - 在PIC18F中实现定时器以生成随机数

C# Windows 服务与计时器不发送数据

c# - 结合正面前瞻和负面前瞻?

c# - 如何分别播放音频文件的每个 channel ?