.net - threading timer使用




System.Timers.Timer与System.Threading.Timer (6)

System.Threading.Timer是一个普通的计时器。 它会回调一个线程池线程(来自工作池)。

System.Timers.Timer是一个System.ComponentModel.Component ,它封装了一个System.Threading.Timer ,并提供了一些用于在特定线程上分派的附加功能。

System.Windows.Forms.Timer改为包装一个本地message-only-HWND并使用Window Timers在该HWNDs消息循环中引发事件。

如果您的应用程序没有用户界面,并且您希望最轻量级和通用的.Net计时器成为可能,(因为您很高兴找出自己的线程/调度),那么System.Threading.Timer就像它一样好该框架。

我不完全清楚System.Threading.Timer所假设的'非线程安全'问题。 也许它和这个问题中的问题一样: System.Timers.Timer与System.Threading.Timer的线程安全性 ,或者每个人都意味着:

  1. 当你使用定时器时很容易写出竞争条件。 例如看到这个问题: Timer(System.Threading)线程安全

  2. 计时器通知重新进入,您的计时器事件可以触发,并在完成处理第一个事件之前再次回电。 例如看到这个问题: 使用System.Threading.Timer和Monitor进行线程安全执行

最近我一直在检查一些可能的定时器,并且Threading.TimerTimers.Timer是那些看起来需要我的东西(因为它们支持线程池)。

我正在制作一款游戏,并且计划使用所有类型的事件,并使用不同的时间间隔等。

哪一个会是最好的?


System.Timers.Timer似乎被.NET Core和ASP.NET Core弃用。 所以请尝试在将来的应用程序中使用System.Threading.Timer

编辑:好的,让我更加精确:

使用新的.NET Core Framework,Microsoft停止了.NET Framework的一些技术。 要了解这一点:.NET Core是一个全新的框架 - 重写,跨平台等。我不想深入这里深入细节 - 请阅读.NET博客

在这篇博客中,有一篇很好的文章向.NET Core移植,这也解释了你可能遇到的困难。 其中的一部分就是使用.NET可移植性分析器Visual Studio加载项并修复您得到的错误。

对于System.Timers.Timer类,它表示支持.NET Framework,Version = v4.6.2,但是.NET Core,Version = v5.0和.NETPlatform,Version = v5.0不支持。 建议的更改: Use System.Threading.Timer

因此,那看起来System.Timers.Timer已经不在.NET Core中。

PS:但它可能会回来 - 微软宣布他们希望对CoreCLR(您用于.NET Core的框架的名称)进行一些更改,以便简化移植工作。


从MSDN开始: System.Threading.Timer是一个简单的轻量级计时器,它使用回调方法并由线程池线程提供服务。 不建议用于Windows窗体,因为它的回调不会在用户界面线程上发生。 System.Windows.Forms.Timer是用于Windows窗体的更好选择。 对于基于服务器的定时器功能,您可以考虑使用System.Timers.Timer ,它引发事件并具有其他功能。

Source


在他的书“ CLR Via C# ”中, Jeff Ritcher不鼓励使用System.Timers.Timer ,该计时器是从System.ComponentModel.Component派生的,允许它在Visual Studio的设计表面中使用。 所以只有在设计表面上需要定时器时才有用。

他更喜欢在线程池线程上使用System.Threading.Timer作为后台任务。


本文提供了一个相当全面的解释:

比较.NET Framework类库中的定时器类 ” - 也可作为.chm文件使用

具体的区别似乎是System.Timers.Timer面向多线程应用程序,因此通过其SynchronizationObject属性是线程安全的,而System.Threading.Timer具有讽刺意味的是不是线程安全的开箱即用。

我不相信两者之间存在差异,因为它与你的间隔有多小有关。


这两个类在功能上是等价的,不同之处在于System.Timers.Timer通过设置SynchronizingObject来选择通过ISynchronizeInvoke调用其所有定时器到期回调。 否则,这两个定时器将调用线程池线程上的过期回调。

System.Timers.Timer拖到Windows窗体设计图面上时,Visual Studio会将SynchronizingObject设置为表单对象,这将导致在UI线程上调用所有到期回调。





timer