首页 > 编程语言 >C#实现定时器的几种方案

C#实现定时器的几种方案

时间:2022-09-27 19:45:48浏览次数:64  
标签:定时器 C# System Timer 几种 Windows Timers 线程

C#实现定时器的几种方案

在C#里关于定时器类就有三个

1、System.Windows.Forms.Timer

2、System.Threading.Timer

3、定义在System.Timers.Timer

下面对这三个类进行讲解。

System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中  的Timer控件,内部使用API SetTimer实现的。它的主要缺点是计时不精确,而且必须有消息循环,Console  Application(控制台应用程序)无法使用。

System.Timers.Timer和System.Threading.Timer非常类似,它们都是通过.NET  Thread  Pool实现的,轻量,计时精确,对应用程序、消息没有特别的要求。System.Timers.Timer还可以应用于WinForm,完全取代上面的System.Windows.Forms.Timer控件。

System.Windows.Forms.Timer

计时器最宜用于 Windows 窗体应用程序中,并且必须在窗口中使用,适用于单线程环境,

在此环境中, UI 线程用于执行处理。它要求用户代码提供 UI 消息泵, 并且始终从同一线程操作, 或将调用封送到

其他线程。Windows 窗体计时器组件是单线程的, 且限制为55毫秒的准确度,准确性不高

  1. public partial class frmTimerDemo : Form
  2. {
  3. private System.Windows.Forms.Timer timerGetTime;
  4. private void frmTimerDemo_Load(object sender, EventArgs e)
  5. {
  6. //创建定时器
  7. timerGetTime = new System.Windows.Forms.Timer();
  8. //设置定时器属性
  9. timerGetTime.Tick+=new EventHandler(HandleTime);
  10. timerGetTime.Interval = 1000;
  11. timerGetTime.Enabled = true;
  12. //开启定时器
  13. timerGetTime.Start();
  14. }
  15. public void HandleTime(Object myObject, EventArgs myEventArgs)
  16. {
  17. labelTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  18. }
  19. private void frmTimerDemo_FormClosed(object sender, FormClosedEventArgs e)
  20. {
  21. //停止定时器
  22. timerGetTime.Stop();
  23. }
  24. }

System.Timers.Timer

这个是目前我们定时项目中常用的。

  1. System.Timers.Timer t = new System.Timers.Timer(10000);//实例化Timer类,设置间隔时间为10000毫秒;
  2. t.Elapsed += new System.Timers.ElapsedEventHandler(Execute);//到达时间的时候执行事件;
  3. t.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
  4. t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件;
  5. t.Start(); //启动定时器
  6. //上面初始化代码可以写到构造函数中
  7. public void Execute(object source, System.Timers.ElapsedEventArgs e)
  8. {
  9. t.Stop(); //先关闭定时器
  10. MessageBox.Show("OK!");
  11. t.Start(); //执行完毕后再开启器
  12. }

这里需要注意的是Execute方法中一定要先关闭定时器,执行完毕后再开启。这个是本人经过测试的,如果你注释掉这两句,定时器会不断的执行Execute方法,如果Execute执行的是一个很耗时的方法,会导致方法未执行完毕,定时器又启动了一个线程来执行Execute方法。

System.Threading.Timer

线程计时器也不依赖窗体,是一种简单的、轻量级计时器,它使用回调方法而不是使用事件,并由线程池线程提供支持,先看下面代码

  1. class Program
  2. {
  3. int TimesCalled = 0;
  4. void Display(object state)
  5. {
  6. Console.WriteLine("{0} {1} keep running.", (string)state, ++TimesCalled);
  7. }
  8. static void Main(string[] args)
  9. {
  10. Program p = new Program();
  11. //2秒后第一次调用,每1秒调用一次
  12. System.Threading.Timer myTimer = new System.Threading.Timer(p.Display, "Processing timer event", 2000, 1000);
  13. // 第一个参数是:回调方法,表示要定时执行的方法,第二个参数是:回调方法要使用的信息的对象,或者为空引用,第三个参数是:调用 callback 之前延迟的时间量(以毫秒为单位),指定 Timeout.Infinite 以防止计时器开始计时。指定零 (0) 以立即启动计时器。第四个参数是:定时的时间时隔,以毫秒为单位
  14. Console.WriteLine("Timer started.");
  15. Console.ReadLine();
  16. }
  17. }

上面是c#定时器的集中方案,大家在使用中一定要尽量把定时器声明成静态(static),如果放在实例方法中,会导致实例对象被回收导致定时器失效。

-----------------------------------

公众号【Csharp编程大全】,需要进技术群交流的,请添加小编mm1552923!

https://blog.csdn.net/zls365365/article/details/121804984?utm_term=C#%E4%B8%AD%E5%AE%9A%E6%97%B6%E6%9C%8D%E5%8A%A1&utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduweb~default-3-121804984-null-null&spm=3001.4430

标签:定时器,C#,System,Timer,几种,Windows,Timers,线程
From: https://www.cnblogs.com/sunny3158/p/16735712.html

相关文章

  • 实验2:Open vSwitch虚拟交换机实践
    实验2:OpenvSwitch虚拟交换机实践一、实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通过Mininet的Python......
  • AGC054D
    主要思路来自huzhaoyang大佬对于两个字符串\(s\)和\(t\)(保证其中每一种字符个数相同),定义\(s\)和\(t\)的相对逆序对数为\(s\)得到\(t\)的最少交换次数,显然同......
  • LeetCode[279. 完全平方数]
    279.完全平方数本题我们可以把他理解成一个图论我们的每一个结点就是每一个数值加了平方项以后就从当前值转移到了另一个值BFS常见套路定义一个队列,队列中有元素就......
  • 实验2:Open vSwitch虚拟交换机实践
    实验2:OpenvSwitch虚拟交换机实践一、实验目的能够对OpenvSwitch进行基本操作;能够通过命令行终端使用OVS命令操作OpenvSwitch交换机,管理流表;能够通过Mininet的Pytho......
  • Spring MVC框架:第五章:静态资源访问与mvc:view-controlle
    静态资源访问1.提出静态资源问题Web项目的开发不可避免的要使用静态资源。在我们的项目中图片文件、音视频文件、CSS文件、JavaScript文件、HTML文件等等凡是浏览器直接......
  • 数据库:子查询讲解!插入子查询结果 基本格式:INSERT INTO <表名>[(<字段1>[,…])] SELEC
    数据库:子查询讲解!在SQL语言中,一个SELECT-FROM-WHERE语句称为一个查询块。将一个查询块嵌套在另一个查询块的WHERE子句或HAVING短语中的查询称为嵌套查询或子查询。子查询......
  • Open vSwitch虚拟交换机实践
    实验2:OpenvSwitch虚拟交换机实践(一)基本要求1.ovs-vsctl基础操作实践:创建OVS交换机,完成相关要求后查看网络状态与端口信息:2.使用Mininet搭建的SDN拓扑,如下图所示,要求......
  • gcc小总结
    老师给出的优秀同学的总结,值得我们借鉴https://www.cnblogs.com/cqszxy2020/p/16728641.html附上本人对其的学习过程1.静态链接库2.动态链接库over......
  • Echarts自定义提示框案例
    官方文档:#tooltip.formatter两种方法,如trigger:'axis'的情况下,均在tooltip节点下添加如下:1.模板字符串formatter:'<spanstyle="font-size:10px">{b}</span><div......
  • Cocos Creator用jtest单元测试攻略极速版
    主要参考了CocosCreator中单元测试入门,但是该文代码在我电脑上并没有正常执行,所以修正后写了本文。毕竟,一篇攻略,最基本的要求应该是,可以成功运作。想要了解到底是为什么......