c# - 在退出程序之前等待 System.Threading.Timer 回调完成

标签 c# multithreading timer

我有一个 List<System.Threading.Timer> .每个计时器以可配置的时间间隔触发(默认 10 分钟)。所有调用相同的回调方法(具有不同的参数)。回调方法可能需要几秒钟才能完成其工作。

当程序终止时,回调方法的执行似乎立即停止(我没看错吗?)。

如何在退出程序之前优雅地等待任何当前正在执行的回调方法完成?

最佳答案

您可以使用 WaitHandler 参数处理所有计时器。仅当回调方法完成时才会向此处理程序发出信号(如规范所述:“在所有当前排队的回调完成之前,计时器不会被释放。”)

void WaitUntilCompleted(List<Timer> myTimers)
{
    List<WaitHandle> waitHnd = new List<WaitHandle>();
    foreach (var timer in myTimers)
    {
        WaitHandle h = new AutoResetEvent(false);
        if(!timer.Dispose(h)) throw new Exception("Timer already disposed.");
        waitHnd.Add(h);
    }
    WaitHandle.WaitAll(waitHnd.ToArray());
}

编辑: @Peter 强调了 Dispose 方法返回值的重要性。当定时器已经被释放时它返回 false。为了确保此解决方案保持可靠,我将其修改为在 Timer 已处置时抛出异常,因为在这种情况下我们无法控制其回调何时结束,尽管之前的处置回调可能仍在运行!

关于c# - 在退出程序之前等待 System.Threading.Timer 回调完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9061484/

相关文章:

c# - 最小起订量,调用具有构造函数依赖性的基础

c# - 在 VS2010 中更改 Web 项目中的输出路径

c# - 母版/内容页和 Request.Form/控件名称

c++ - C/C++ 计时器,如瑞士 watch

Java Swing - 使用 Swing Timer 类移动 JLabels

Java 2D 游戏 - 定时器与线程?

c# - 如何将模型状态错误添加到列表中

c - 使用传递给线程的 pthread_mutex_t 锁

c++ - 在 20 行程序中创建 C 线程。为什么它不起作用?

java - 在变化数量的线程中并发重复相同的任务