C# System.Timers.Timer 类已用事件和定时器的一般注意事项
Posted
技术标签:
【中文标题】C# System.Timers.Timer 类已用事件和定时器的一般注意事项【英文标题】:C# System.Timers.Timer Class elapsed event and timer general precautions 【发布时间】:2020-09-14 01:40:41 【问题描述】:两个问题。
一:在 winforms 应用程序中,在它的 elapsed 事件中启用和禁用 system.timers.timer 是个好主意还是坏主意,以便主 UI 线程可以访问在其上创建的变量和方法那个主 UI 线程?以代码为例:
myElapsedTimerEvent(object sender, ElapsedEventArgs args)
timer.enabled = false;
/***Call some functions and manipulate some variables***/
timer.enabled = true;
二:根据大家的经验,winform和c#中的system.timers.timer有哪些注意事项和需要注意的危险?如果没有正确使用计时器,您是否可以提供任何关于硬件和/或软件可能发生的事情的示例?
任何关于使用 system.timers.timer 的建议将不胜感激。
感谢阅读。
【问题讨论】:
为什么不使用 Windows 窗体计时器? 一个windows.forms.timer可以有多个实例吗?原因是正在制作的应用程序需要同时至少做两件事。 Windows 窗体计时器可以完成这样的任务吗? 禁用和重新启用计时器将导致它不同步...例如如果您的计时器设置为 1000 毫秒,但您的代码执行需要 10-20 毫秒,则计时器事件将每 1010-1020 毫秒触发一次,这可能会对您产生影响。如果您担心两个经过的事件同时访问相同的变量,我建议使用lock
。
感谢您的快速回复。我将研究表单计时器和锁。如果有其他建议,请告诉我!谢谢!
@someuser193 - 你想拥有多少就拥有多少。为什么不测试一下?
【参考方案1】:
如果事件处理程序在 UI 线程中执行,从事件处理程序内部设置计时器的Enabled
属性是安全的。否则不安全,因为System.Timers.Timer
类is not thread-safe。要使处理程序在 UI 线程中执行,您必须将计时器的SynchronizingObject
属性设置为当前的Form
。例如:
public Form1()
InitializeComponent();
timer = new Timers.Timer(5000);
timer.Elapsed += Timer_Elapsed;
timer.SynchronizingObject = this;
timer.AutoReset = true;
如果我没记错的话,当您使用设计器在Form
中添加Timer
时,此分配会自动发生。
我的建议是使用System.Windows.Forms.Timer
,因为它没有考虑线程安全。您不仅限于一个计时器。您可以拥有任意数量的它们。请记住,它们的处理程序是在 UI 线程中运行的,因此您应该避免在其中放置冗长的代码,否则 UI 的响应性可能会受到影响。
【讨论】:
Theodor Zoulias,感谢您的宝贵时间和详细解释。我接受了使用 System.Windows.Forms.Timer 的建议。我正在使用多个表单计时器来处理代码中的事情,我对结果和程序的安全性感觉好多了。非常感谢您的帮助。谢谢!!以上是关于C# System.Timers.Timer 类已用事件和定时器的一般注意事项的主要内容,如果未能解决你的问题,请参考以下文章
通过C#的System.Timers.Timer封装一个定时任务工具
使用System.Timers.Timer类实现程序定时执行