我最近一直在查看一些可能的计时器,而Threading.Timer和Timers.Timer对我来说是必要的(因为它们支持线程池)。

我正在制作游戏,我计划使用不同类型的活动,间隔不同等。

哪个最好?


#1楼

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

“ 比较.NET Framework类库中的Timer类 ” - 也可用作.chm文件

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

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


#2楼

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

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

System.Windows.Forms.Timer改为包装本机仅消息HWND,并使用Window Timers在该HWND消息循环中引发事件。

如果您的应用程序没有UI,并且您想要最轻量级和通用的.Net计时器,(因为您很高兴找到自己的线程/调度),那么System.Threading.Timer就像它获得的一样好框架。

我不完全清楚System.Threading.Timer所谓的“非线程安全”问题是什么。 也许它与这个问题中的问题相同: System.Timers.Timer与System.Threading.Timer的线程安全 ,或者也许每个人只是意味着:

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

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


#3楼

我在MSDN上找到了一个简短的比较

.NET Framework类库包含四个名为Timer的类,每个类都提供不同的功能:

System.Timers.Timer ,它会定期触发事件并在一个或多个事件接收器中执行代码。 该类旨在用作多线程环境中的基于服务器或服务组件; 它没有用户界面,在运行时不可见。

System.Threading.Timer ,它定期在线程池线程上执行单个回调方法。 回调方法是在实例化定时器时定义的,无法更改。 与System.Timers.Timer类一样,此类旨在用作多线程环境中的基于服务器或服务组件; 它没有用户界面,在运行时不可见。

System.Windows.Forms.Timer ,一个Windows窗体组件,用于触发事件并定期在一个或多个事件接收器中执行代码。 该组件没有用户界面,专为在单线程环境中使用而设计。

System.Web.UI.Timer ,一个ASP.NET组件,定期执行异步或同步网页回发。


#4楼

这两个类在功能上是等效的,除了System.Timers.Timer有一个选项,通过设置SynchronizingObject来通过ISynchronizeInvoke调用它的所有计时器到期回调。 否则,两个计时器都会调用线程池线程上的到期回调。

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


#5楼

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

资源


#6楼

上面没有提到的一个可能会让你感到System.Timers.Timer重要区别是System.Timers.Timer静默地吞下异常,而System.Threading.Timer却没有。

例如:

var timer = new System.Timers.Timer { AutoReset = false };
timer.Elapsed += (sender, args) =>
{var z = 0;var i = 1 / z;
};
timer.Start();

VS

var timer = new System.Threading.Timer(x =>
{var z = 0;var i = 1 / z;
}, null, 0, Timeout.Infinite);

#7楼

Microsoft提供的有关此信息(请参阅MSDN上的备注 ):

  • System.Timers.Timer ,它会定期触发事件并在一个或多个事件接收器中执行代码。 该类旨在用作多线程环境中的基于服务器或服务组件; 它没有用户界面,在运行时不可见。
  • System.Threading.Timer ,它定期在线程池线程上执行单个回调方法。 回调方法是在实例化定时器时定义的,无法更改。 与System.Timers.Timer类一样,此类旨在用作多线程环境中的基于服务器或服务组件; 它没有用户界面,在运行时不可见。
  • System.Windows.Forms.Timer (仅限.NET Framework),一种Windows窗体组件,用于触发事件并定期在一个或多个事件接收器中执行代码。 该组件没有用户界面,专为在单线程环境中使用而设计; 它在UI线程上执行。
  • System.Web.UI.Timer (仅限.NET Framework),一种ASP.NET组件,定期执行异步或同步网页回发。

有趣的是, System.Timers.Timer在.NET Core 1.0中已被弃用,但在.NET Core 2.0(/ .NET Standard 2.0)中再次实现。 .NET Standard 2.0的目标是尽可能简单地从.NET Framework切换,这可能就是它回归的原因。

不推荐使用时, .NET Portability Analyzer Visual Studio加载项建议使用System.Threading.Timer

看起来Microsoft在System.Threading.Timer之前支持System.Timers.Timer

编辑说明2018-11-15:由于有关.NET Core 1.0的旧信息不再有效,我提交了更改我的答案。


#8楼

在他的书“ CLR Via C# ”中, Jeff Ritcher不鼓励使用System.Timers.Timer ,这个计时器派生自System.ComponentModel.Component ,允许它在Visual Studio的设计界面中使用。 因此,只有在设计图面上需要计时器时它才有用。

他更喜欢使用System.Threading.Timer来处理线程池线程上的后台任务。

System.Timers.Timer与System.Threading.Timer相关推荐

  1. System.Timers.Timer与System.Windows.Forms.Timer 区别

    根据msdn解释:System.Threading.Timer 是一个简单的轻量计时器,它使用回调方法并由线程池线程提供服务. 不建议将其用于 Windows 窗体,因为其回调不在用户界面线程上进行. ...

  2. System.Windows.Forms.Timer与System.Timers.Timer的区别

    .NET Framework里面提供了三种Timer: System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer VS ...

  3. 使用System.Timers.Timer类实现程序定时执行

    在C#里关于定时器类有3个:System.Windows.Forms.Timer类.System.Threading.Timer类和System.Timers.Timer类. System.Windo ...

  4. System.Threading.Timer 定时器的用法

    System.Threading.Timer 是C# 中的一个定时器,可以定时(不断循环)执行一个任务.它是在线程上执行的,具有很好的安全性.为此  .Net Framework 提供了5个重载的构造 ...

  5. C#学习常用类(1003)---Timer类(System.Timers.Timer)

    Timer类: 在设定的间隔之后生成事件,带有生成重复事件的选项. 若要浏览此类型的 .NET Framework 源代码,请参阅引用源. 命名空间:                   System ...

  6. System.Timers.Timer的Enable、Start、Stop记录

    Timer的初始化,此时不执行theout3方法 System.Timers.Timer time = new System.Timers.Timer(); time.Interval = 1000; ...

  7. C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题

    C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 参考文章: (1)C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 ( ...

  8. System.Timers.Timer 多线程问题[转]

    已解决问题] System.Timers.Timer 多线程 ,同时首次进 声明: System.Timers.Timer timer = new System.Timers.Timer(); tim ...

  9. System.Threading.Timer类的TimerCallback 委托

    System.Threading.Timer类的TimerCallback 委托 Written by: Rickie Lee Nov. 19, 2004 System.Threading.Timer ...

最新文章

  1. 为什么要学C语言及C语言存在的意义,新手经常犹豫学不学C语言
  2. MAC下 Apache服务器配置
  3. 施密特出售Google股票套现3.27亿美元
  4. Apple 预计于内华达州雷诺市再盖一个数据中心
  5. 利用arcgis将execl数据可视化(点)
  6. spss相关性分析看结果_spss相关性分析
  7. C++学习之路 | PTA乙级—— 1042 字符统计 (20 分)(精简)
  8. truffle unbox webpack报错
  9. slackware启动脚本详解
  10. php 服务器安装,php服务器安装笔记
  11. 问题 D: 自动拨出电话的程序
  12. g++: command not found
  13. ZStack跨平台迁移可以如此简单
  14. 谈谈我的微软特约稿:《SQL Server 2014 新特性:IO资源调控》
  15. 欧冠之王!曼联3球大逆转,球王C罗再度绝杀救主!
  16. copy ctor、copy assignment(拷贝构造函数和拷贝赋值函数)
  17. 帮你早点下班~基于飞书API实现next.js网站内容自动生成实践
  18. 学习ARM开发(1)
  19. VueDemo-21 确认订单
  20. matlab中矩阵取值的方法

热门文章

  1. 求解射线交点的完整代码
  2. const变量的使用方法。。
  3. viewpager 无网络的时候滑动异常
  4. 【剑指offer-Java版】20顺时针打印矩阵
  5. 第十、十一周项目-阅读程序,写出这些程序的运行结果(2)
  6. SSL--用Tomcat服务器配置https双向认证过程实战
  7. C语言函数名与函数指针详解
  8. 银行计算机设备管理 总结,【2017年银行自助设备中心年终总结】_银行自助设备工作总结...
  9. Android之一窥究竟Activity间的数据传递以及Intent的用处
  10. Spark Shuffle两种Manager