我有一个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已经处理的时候抛出异常,因为我们无法控制这种情况,当它的回调结束时,尽管早期的处理回调可能仍在运行!