System.Threading.Timer 低级实现
System.Threading.Timer low level implementation
我想了解 System.Threading.Timer 或 .net 中的计时器在底层的工作原理。我想要得到的是一个概览。
我的疑问是,计时器一旦执行,线程或进程是否总是 运行,它如何收到时间结束的通知,它是否像时钟或 PIT 或其他东西的中断一样接收? .如果不总是 运行 如果有一段时间线程或进程可能不是 运行,时间将如何正确。
我不知道它的确切实现,但我想它会启动一个新线程,记录当前系统滴答计数并设置一个循环,将起始滴答计数与当前滴答计数进行比较。当它达到设置的间隔时,它会引发一个事件,本质上是一个回调。在低级别上,它使用指针调用其范围之外的函数。
计时器不精确到毫秒。我认为分辨率大约是15ms。
我不确定这是否真的是这样做的,所以我希望你能得到更多的答案。
使用线程可以,但效率很低。
定时器只是数据结构。有一个.NET 端数据结构和一个内核数据结构。内核知道如何在截止日期到期时通知线程。线程没有必要坐在那里等待。 (稍微简化一下。)
有一个基于 .NET 的优化层,它试图创建尽可能少的内核计时器,以使计时器更便宜。基本上,所有计时器都在一个队列中。当 最早 .NET 计时器耗尽时,有一个内核计时器耗尽。
定时器真的很便宜。
我想了解 System.Threading.Timer 或 .net 中的计时器在底层的工作原理。我想要得到的是一个概览。
我的疑问是,计时器一旦执行,线程或进程是否总是 运行,它如何收到时间结束的通知,它是否像时钟或 PIT 或其他东西的中断一样接收? .如果不总是 运行 如果有一段时间线程或进程可能不是 运行,时间将如何正确。
我不知道它的确切实现,但我想它会启动一个新线程,记录当前系统滴答计数并设置一个循环,将起始滴答计数与当前滴答计数进行比较。当它达到设置的间隔时,它会引发一个事件,本质上是一个回调。在低级别上,它使用指针调用其范围之外的函数。
计时器不精确到毫秒。我认为分辨率大约是15ms。
我不确定这是否真的是这样做的,所以我希望你能得到更多的答案。
使用线程可以,但效率很低。
定时器只是数据结构。有一个.NET 端数据结构和一个内核数据结构。内核知道如何在截止日期到期时通知线程。线程没有必要坐在那里等待。 (稍微简化一下。)
有一个基于 .NET 的优化层,它试图创建尽可能少的内核计时器,以使计时器更便宜。基本上,所有计时器都在一个队列中。当 最早 .NET 计时器耗尽时,有一个内核计时器耗尽。
定时器真的很便宜。