我有一个 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/