网站首页 > java教程 正文
前几天写了一篇java的定时器方案,应小伙伴的要求,今天这里一下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毫秒的准确度,准确性不高
public partial class frmTimerDemo : Form { private System.Windows.Forms.Timer timerGetTime; private void frmTimerDemo_Load(object sender, EventArgs e) { //创建定时器 timerGetTime = new System.Windows.Forms.Timer(); //设置定时器属性 timerGetTime.Tick+=new EventHandler(HandleTime); timerGetTime.Interval = 1000; timerGetTime.Enabled = true; //开启定时器 timerGetTime.Start(); } public void HandleTime(Object myObject, EventArgs myEventArgs) { labelTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); } private void frmTimerDemo_FormClosed(object sender, FormClosedEventArgs e) { //停止定时器 timerGetTime.Stop(); } }
System.Timers.Timer
这个是目前我们定时项目中常用的。
System.Timers.Timer t = new System.Timers.Timer(10000);//实例化Timer类,设置间隔时间为10000毫秒; t.Elapsed += new System.Timers.ElapsedEventHandler(Execute);//到达时间的时候执行事件; t.AutoReset = true;//设置是执行一次(false)还是一直执行(true); t.Enabled = true;//是否执行System.Timers.Timer.Elapsed事件; t.Start(); //启动定时器 //上面初始化代码可以写到构造函数中 public void Execute(object source, System.Timers.ElapsedEventArgs e) { t.Stop(); //先关闭定时器 MessageBox.Show("OK!"); t.Start(); //执行完毕后再开启器 }
这里需要注意的是Execute方法中一定要先关闭定时器,执行完毕后再开启。这个是本人经过测试的,如果你注释掉这两句,定时器会不断的执行Execute方法,如果Execute执行的是一个很耗时的方法,会导致方法未执行完毕,定时器又启动了一个线程来执行Execute方法。
System.Threading.Timer
线程计时器也不依赖窗体,是一种简单的、轻量级计时器,它使用回调方法而不是使用事件,并由线程池线程提供支持,先看下面代码
class Program { int TimesCalled = 0; void Display(object state) { Console.WriteLine("{0} {1} keep running.", (string)state, ++TimesCalled); } static void Main(string[] args) { Program p = new Program(); //2秒后第一次调用,每1秒调用一次 System.Threading.Timer myTimer = new System.Threading.Timer(p.Display, "Processing timer event", 2000, 1000); // 第一个参数是:回调方法,表示要定时执行的方法,第二个参数是:回调方法要使用的信息的对象,或者为空引用,第三个参数是:调用 callback 之前延迟的时间量(以毫秒为单位),指定 Timeout.Infinite 以防止计时器开始计时。指定零 (0) 以立即启动计时器。第四个参数是:定时的时间时隔,以毫秒为单位 Console.WriteLine("Timer started."); Console.ReadLine(); } }
上面是c#定时器的集中方案,大家在使用中一定要尽量把定时器声明成静态(static),如果放在实例方法中,会导致实例对象被回收导致定时器失效。
如果这篇文章对您有帮助,可转发分享一下。
猜你喜欢
- 2025-04-07 js基础之setTimeout与setInterval原理分析
- 2025-04-07 Java 中的 Thread.sleep()(java 中的关键字)
- 2025-04-07 京东大佬问我,在SpringBoot中怎么使用时间轮?要考虑哪些方面?
- 2025-04-07 Java多线程系列(九):CountDownLatch...
- 2025-04-07 Java面试篇基础部分-JVM详细介绍(java面试必备 基础知识篇)
- 2025-04-07 C++ 使用Poco库的定时器(c++设置定时器)
- 2025-04-07 Netty 心跳检测(netty websocket 心跳检测)
- 2025-04-07 在 Java Spring Boot 项目中使用结构化日志节省时间
- 2025-04-07 Java-Redis(javaredis设置过期时间)
- 2025-04-07 java-jvm(一)(javajvm调优步骤)
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)