加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 18:03:52 所属栏目:百科 来源:网络整理
导读:我有一个List System.Threading.Timer.每个定时器以可配置的间隔触发(默认为10分钟).所有调用相同的回调方法(使用不同的参数).回调方法可能需要几秒钟才能完成它的工作. 当程序终止时,看起来执行回调方法立即停止(我正在看到正确?). 在退出程序之前,如何优
我有一个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已经处理的时候抛出异常,因为我们无法控制这种情况,当它的回调结束时,尽管早期的处理回调可能仍在运行!

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读