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

C# system.timers.timer 奇怪的行为

通过C#的System.Timers.Timer封装一个定时任务工具

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

c# 怎么设置 System.Timers.Timer执行次数 t5.AutoReset = false;

System.Timers.Timer 每秒最多只能提供 64 帧