Timer是.NET中定时触发一个事件处理方法的类

本文详细介绍了如何正确使用System.Threading.Timer的Dispose方法来停止定时触发,并确保所有已调度的事件处理方法执行完毕。通过使用WaitHandle和ManualResetEvent,可以等待Timer完全停止,同时处理可能的ObjectDisposedException异常。文章还提供了示例代码,展示了如何在多线程环境下避免 Dispose 后的异常问题。
摘要由CSDN通过智能技术生成

ystem.Threading.Timer是.NET中定时触发一个事件处理方法的类(本文后面简称Timer),它背后依靠的是.NET的线程池(ThreadPool),所以当Timer在短时间内触发了过多的事件处理方法后,可能会造成事件处理方法在线程池(ThreadPool)中排队,可以参考这篇文章。

 

我们启动Timer后,如果我们想停止它,必须要用到Timer.Dispose方法,该方法会让Timer停止启动新的线程去执行事件处理方法,但是已经在线程池(ThreadPool)中处理和排队的事件处理方法还是会被继续执行,而Timer.Dispose方法会立即返回,它并不会被阻塞来等待剩下在线程池(ThreadPool)中处理和排队的事件处理方法都执行完毕。

 

所以这个时候我们需要一个机制来知道当Timer.Dispose方法被调用后,剩下在线程池(ThreadPool)中处理和排队的事件处理方法,是否都已经被执行完毕了。这个时候我们需要用到Timer的bool Dispose(WaitHandle notifyObject)重载方法,这个Dispose方法会传入一个WaitHandle notifyObject参数,当Timer剩下在线程池(ThreadPool)中处理和排队的事件处理方法都执行完毕后,Timer会给Dispose方法传入的WaitHandle notifyObject参数发出一个信号,而我们可以通过WaitHandle.WaitOne()方法来等待该信号,在收到信号前WaitHandle notifyObject会被一直阻塞,代码如下所示(基于.NET Core控制台项目):

复制代码
using System;
using System.Threading;

namespace TimerDispose
{
    class Program
    {
        static Timer timer = null;
        static ManualResetEvent timerDisposed = null;//ManualResetEvent继承WaitHandle
        static int timeCount = 0;

        static void CreateAndStartTimer()
        {
            //初始化Timer,设置触发间隔为2000毫秒
            timer = new Timer(TimerCallBack, null, 0, 2000);
        }

        /// <summary>
        /// TimerCallBack方法是Timer每一次触发后的事件处理方法
        /// </summary>
        static void TimerCallBack(object state)
        {
            //模拟做一些处理逻辑的事情

            timeCount++;//每一次Timer触发调用TimerCallBack方法后,timeCount会加1

            //当timeCount为100的时候,调用Timer.Change方法来改变Timer的触发间隔为1000毫秒
            if (timeCount == 100)
            {
                timer.Change(0, 1000);
            }
        }

        static void Main(string[] args)
        {

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值