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)
{