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

前端之家收集整理的这篇文章主要介绍了c# – 等待System.Threading.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已经处理的时候抛出异常,因为我们无法控制这种情况,当它的回调结束时,尽管早期的处理回调可能仍在运行!

原文链接:https://www.f2er.com/csharp/97417.html

猜你在找的C#相关文章