原文地址:https://cloud.tencent.com/developer/article/1530659

在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),如果放在实例方法中,会导致实例对象被回收导致定时器失效。

C#实现定时器的几种方案的更多相关文章

  1. 【Win 10 应用开发】文件读写的三种方案

    本文老周就跟伙伴们探讨一下关于文件读写的方法.总得来说嘛,有三种方案可以用,而且每种方案都各有特色,也说不上哪种较好.反正你得记住老祖宗留给我们的大智慧——事无定法,灵活运用者为上. OK,咱们开始吧 ...

  2. 集合框架,ArrayList和Vector的区别,让arrayList线程安全的几种方案

    boolean add(E e) 将指定的元素添加到此列表的尾部. void add(int index, E element) 将指定的元素插入此列表中的指定位置. boolean addAll(C ...

  3. javascript 网络是否连接的几种方案

    js   网络是否连接的几种方案 1.通过html5的新属性: window.onload = function () {            var isOnLine = navigator.on ...

  4. javascript把IP地址转为数值几种方案,来挑战一下效率吧

    先看看什么是IP地址: IP地址是一个32位的二进制数,通常被分割为4个“8位二进制数”(也就是4个字节).IP地址通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~25 ...

  5. [转] Asp.Net 导出 Excel 数据的9种方案

    湛刚 de BLOG 原文地址 Asp.Net 导出 Excel 数据的9种方案 简介 Excel 的强大之处在于它不仅仅只能打开Excel格式的文档,它还能打开CSV格式.Tab格式.website ...

  6. 浅谈实现placeholder效果的几种方案

    placeholder是html5<input>的一个属性,它提供可描述输入字段预期值的提示信息(hint), 该提示会在输入字段为空时显示.高端浏览器支持此属性(ie10/11在获得焦点 ...

  7. GPRS组网的几种方案【来自网络】

    GPRS组网的几种方案:1) 方案一:中心采用ADSL等INTELNET公网连接,采用公网固定IP或者公网动态IP+DNS解析服务.此种方案向先INTERNET运营商申请ADSL等宽带业务.     ...

  8. SP避免Form重复提交的三种方案

    SP避免Form重复提交的三种方案  1) javascript ,设置一个变量,只允许提交一次.   <script language="javascript">  ...

  9. 防止服务器宕机时MySQL数据丢失的几种方案

    这篇文章主要介绍了防止服务器宕机时MySQL数据丢失的几种方案,结合实践介绍了Replication和Monitor以及Failover这三个项目的应用,需要的朋友可以参考下. 对于多数应用来说,My ...

  10. C#技术分享【PDF转换成图片——13种方案】(2013-07-25重新整理)

    原文:C#技术分享[PDF转换成图片--13种方案](2013-07-25重新整理) 重要说明:本博已迁移到 石佳劼的博客,有疑问请到 文章新地址 留言!!! 写在最前面:为了节约大家时间,撸主把最常 ...

随机推荐

  1. 读取excel单元格填过得的坑

    通过TdxSpreadSheet读取excel单元格值. 有一个cxDBTreeList来来表现科室单元,可是从科室单元excel文件中读取单元内容后,各种报错.一度怀疑cxdbtree的bug. 实 ...

  2. c流程控制

    关于流程控制,一般来说,计算机使用有着三种流程:一就是正常走,按照预先设定的语句序列执行,二就是重复做那么几个动作,直到满足条件,三就是有几条分支走向,根据目前条件去选择分支序列执行. 一.C中的循环 ...

  3. [转自洛谷]洛谷KateX公式大全【LateX】

    前言 由于在洛谷,有很多人对于\(\KaTeX\)和\(\LaTeX\)之间的关系并不清楚,导致很多人去搜\(\LaTeX\)的资料,然后发现有许多指令无法在洛谷运行. 但是事实上,\(\KaTeX\ ...

  4. 还有的时候,会遇到DataGrid里面嵌套DataGrid(重叠嵌套),然后里面的鼠标滚轮无法响应外面的滚动,为此记录下解决方案

    与上一篇区别在于,详情里面的模板通常是通用的,被定义在样式文件中,被重复使用,因此无法为其添加后台代码,如果能添加后台代码,请翻阅第一篇:所以需要用到命令的方式来辅助事件的抛出,当然还可以利用第三方库 ...

  5. JDK、tomcat、MySQL安装部署

    大数据开发实战 计算机基础普及 [计算机基础与网络.1](动态主机配置协议 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议) 是 RFC 1541( ...

  6. StarBlog和Masuit.MyBlogs博客程序学习使用日记(二)

    使用中发现管理平台的博客列表无法查看,发现是echarts.min.js引用路径无效,找到route.config.js之后找到对应的菜单配置项修改对应的路径为https://cdn.staticfi ...

  7. 解决 Dify 部署中 Podman WSL 容器文件权限问题

    解决 Dify 部署中 Podman WSL 容器文件权限问题 在使用 Podman 进行 Dify 部署时,遇到了一个关键问题:启动服务时出现 initdb: error: could not ch ...

  8. C#/.NET/.NET Core技术前沿周刊 | 第 36 期(2025年4.21-4.27)

    前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录.追踪C#/.NET/.NET Core领域.生态的每周最新.最实用.最有价值的技术文章.社区动态.优质项目和学习资源等. ...

  9. golang map 和 interface 的一些记录

    golang的map读取是不需要判断key是否存在的,不存在的key会返回默认值. 如果map的value是interface,那么interface是需要先进行类型转换的,非要求类型的转换,得到结果 ...

  10. [虚拟化/云原生] Kubernetes 安装部署指南

    1 Kubernetes 安装部署指南 1.1 前置工作与注意事项 IP Role Hostname Remark 172.16.1.72 master 和 node k8s-master-1 资源有 ...