我最近一直在查看一些可能的计时器,而Threading.Timer和Timers.Timer对我来说是必要的(因为它们支持线程池).
我正在制作游戏,我计划使用不同类型的活动,间隔不同等.
哪个最好?
Dav*_*res 357
本文提供了相当全面的解释:
" 比较.NET Framework类库中的Timer类 " - 也可用作.chm文件
具体差异似乎System.Timers.Timer是面向多线程应用程序,因此通过其SynchronizationObject属性是线程安全的,而System.Threading.Timer具有讽刺意味的是,它不是开箱即用的线程安全的.
我不认为两者之间存在差异,因为它与您的间隔有多小有关.
Tim*_*ith 159
System.Threading.Timer是一个简单的计时器.它会回调一个线程池线程(来自工作池).
System.Timers.Timer是一个System.ComponentModel.Component包装a System.Threading.Timer,并提供一些用于在特定线程上调度的附加功能.
System.Windows.Forms.Timer而是包装本机仅消息HWND并使用窗口定时器来引发该HWND消息循环中的事件.
如果您的应用程序没有UI,并且您希望最轻量级和通用的.Net计时器成为可能,(因为您很高兴找到自己的线程/调度),那么System.Threading.Timer它就像在框架中一样好.
我不完全清楚所谓的"非线程安全"问题System.Threading.Timer是什么.也许它与这个问题中的问题相同:System.Timers.Timer与System.Threading.Timer的线程安全,或者也许每个人只是意味着:
当你使用计时器时,很容易写出竞争条件.例如看到这个问题: Timer(System.Threading)线程安全
计时器通知的重新进入,您的计时器事件可以触发,并在您完成第一个事件的处理之前第二次回拨您.例如,请参阅此问题:使用System.Threading.Timer和Monitor进行线程安全执行
Her*_*ero 118
在他的书" CLR Via C# "中,Jeff Ritcher不鼓励使用System.Timers.Timer,这个计时器源自System.ComponentModel.Component,允许它在Visual Studio的设计表面中使用.因此,只有在设计图面上需要计时器时它才有用.
他更喜欢System.Threading.Timer在线程池线程上用于后台任务.
ice*_*1e0 38
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.
看起来像微软System.Threading.Timer以前所偏爱System.Timers.Timer.
编辑说明2018-11-15: 由于有关.NET Core 1.0的旧信息不再有效,我提交了更改我的答案.
sto*_*roz 35
上面没有提到的一个可能会让你感到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();
Run Code Online (Sandbox Code Playgroud)
VS
var timer = new System.Threading.Timer(x =>
{
var z = 0;
var i = 1 / z;
}, null, 0, Timeout.Infinite);
Run Code Online (Sandbox Code Playgroud)
Def*_*ult 24
我在MSDN上找到了一个简短的比较
.NET Framework类库包含四个名为Timer的类,每个类都提供不同的功能:
System.Timers.Timer,触发事件并定期在一个或多个事件接收器中执行代码.该类旨在用作多线程环境中的基于服务器或服务组件; 它没有用户界面,在运行时不可见.
System.Threading.Timer,它定期在线程池线程上执行单个回调方法.回调方法是在实例化定时器时定义的,无法更改.与System.Timers.Timer类一样,此类旨在用作多线程环境中的基于服务器或服务组件; 它没有用户界面,在运行时不可见.
System.Windows.Forms.Timer,一个Windows窗体组件,用于触发事件并定期在一个或多个事件接收器中执行代码.该组件没有用户界面,专为在单线程环境中使用而设计.
System.Web.UI.Timer,一个ASP.NET组件,定期执行异步或同步网页回发.
| 归档时间: |
|
| 查看次数: |
276811 次 |
| 最近记录: |