深入浅出多线程系列之七:4种定时器

C#中System.Timers.Timer定时器的elapsed函数传递参数 笔者最近在使用System.Timers.Timer类时,对于如何在Elapsed事件触发时向事件处理函数传递参数存在一些疑惑,后来总算解决了相关问题。总结如下: 1.匿名函数传递 使用Lambda表达式,编写一个匿名方法,直接在订阅事件的同时实现方法体;代码如下: System.Timers.Timer m_timerCheckDTUState=null ; //传递的参数 阅读详情

在Framework中存在着4种定时器:其中分为两类,

多线程计时器

1:System.Threading.Timer

2:System.Timers.Timer

 

特殊目的的单线程计时器:

1:System.Windows.Forms.Timer(Windows Forms Timer)

2:System.Windows.Threading.DispatcherTimer(WPF timer);

 

多线程计时器比较强大,精确,而且可扩展性强;

单线程计时器比较安全,对于更新 Windows Forms controls或者WPF这种简单任务来说更方便。

 

System.Threading.Timer是最简单的多线程计时器。在下面的例子中,定时器在5秒后开始定时1秒的调用Tick方法。

       public static void Main ()
        {
            //5秒后开始运行,接着每隔1秒的调用Tick方法
            Timer tmr = new Timer(Tick, "tick...", 5000, 1000);
            Console.ReadLine();
            tmr.Dispose();
        }
        static void Tick(object data)
        {
            Console.WriteLine(data);
        }

 

.net framework提供的另一个计时器System.Timers.Timer.简单的对System.Threading.Timer进行了包装。增加了下面几个特性。

实现了Component,所以可以在设计器显示。
代替Change方法的一个Interval属性
代替callback委托的一个Elapsed事件
启动和停止timer的Enabled属性,默认是false。
为了避免Enabled造成混乱,提供了Start和Stop方法。
是否在每次指定的间隔结束时引发Elapsed时间,还是仅间隔第一次结束后运行的AutoReset属性。
在WPF或Windows Forms中安全的调用方法的SynchronizingObject对象。
public static void MainThread()
        {
            Timer tmr = new Timer();
            tmr.Interval = 500;
            tmr.Elapsed += new ElapsedEventHandler(tmr_Elapsed);
            tmr.Start();
            Console.ReadLine();
            tmr.Stop();
            Console.ReadLine();
            tmr.Start();
            Console.ReadLine();
            tmr.Dispose();
        }

        static void tmr_Elapsed(object sender, ElapsedEventArgs e)
        {
            Console.WriteLine("Tick...");
        }
 

 

单线程计时器:

1:System.Windows.Forms.Timer(Windows Forms Timer)

2:System.Windows.Threading.DispatcherTimer(WPF timer);

单线程计时器是被设计成属于他们执行环境的计时器,如果你在一个Windows服务应用程序中使用Windows Forms的Timer,timer 事件并不会被触发,只有在对应的环境下才会被触发。

 

 

像System.Timers.Timer一样,他们也提供了相同的成员(Interval,Tick,Start,Stop),但是他们内部的工作原理不同,

WPF和Windows Forms的计时器使用消息循环机制来取代线程池产生消息的机制。

这意味着Tick事件总是在创建timer的那个线程上执行,同时也意味着如果上一个Tick消息还未被处理,即使时间超过了间隔时间,在消息循环中也只存在一个Tick消息。

 

下面是它们的优点:

你可以忘记线程安全。
一个Tick事件在前一个Tick事件被处理完毕前不会被触发。
你可以直接在Tick事件处理代码中更新控件,不需要调用Control.Invoke或Dispatcher.Invoke.
看下在Winform中使用单线程定时器的效果:

       //基于Windows消息循环的单线程计时器
        private System.Windows.Forms.Timer timer = new Timer() { };

        public Form1()
        {
            InitializeComponent();

            timer.Tick += new EventHandler(timer_Tick);
            timer.Enabled = true;
        }

        void timer_Tick(object sender, EventArgs e)
        {
            //模拟的做一些耗时的操作
            System.Threading.Thread.Sleep(2000);
        }
 

如果运行上面的代码,会发现UI界面响应速度很慢,

原理上面已经介绍了:单线程计时器基于Windows消息循环,应用程序会同步的处理计时器的消息。

解决这个问题的方法是使用多线程计时器:只要修改代码使用多线程计时器即可:

 

        //使用多线程计时器
        private System.Timers.Timer timer = new System.Timers.Timer();

        public Form1()
        {
            InitializeComponent();

            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Enabled = true;
        }

        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            //模拟的做一些耗时的操作
            System.Threading.Thread.Sleep(2000);
        }
 

 

 

上面的例子告诉我们单线程计时器的缺点:

除非Tick事件的处理代码执行的非常快,否则UI界面会变得响应很慢。

所以 WPF和Windows Forms的计时器都非常适合小任务,尤其是界面更新的任务。例如时钟和计数显示。否则,你需要一个多线程计时器。

 

源地址: www.2cto.com

深入浅出:QTimer::singleShot在不同Qt版本中的行为差异与最佳实践 本文深入解析了QTimer::singleShot在Qt不同版本中的行为差异与最佳实践,特别关注了定时器类型、线程处理模型及跨版本优化。通过对比Qt 5.x与Qt 6的实现差异,提供了安全使用lambda表达式、管理对象生命周期及优化定时器精度的实用技巧,帮助开发者高效利用这一功能。 阅读详情

相关推荐

C#中实现计时器功能(定时任务和计时多长时间后执行某方法)

场景 在低液位预警弹窗点击确定后需要实现一个计时器,比如在五分钟后再执行监控。 实现思路是使用Timer然后每秒执行一个方法,在方法中对秒数进行减1操作,等倒计时结束后执行相应的操作。 注: 博客主页:https://blog.youkuaiyun.com/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载 实现 但是Timer有三个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里...

BADAO_LIUMANG_QIZHI的博客 2940

WPF-定时器

wpf中有四种定时器 1.System.Threading.Timer 1 private System.Threading.Timer timerClose; 2 timerClose = new System.Threading.Timer(new TimerCallback(timerCall), this, 5000, 0); 3 private void timerCall(Ob...

u014683488的专栏 1829

关于winform使用timer进行多线程操作的例子

关于winform使用timer进行多线程操作的例子 一个关于网段ping的例子 很好的解释了system.timers.timer的用法

多线程:4种定时器

在Framework中存在着4种定时器:其中分为两类, 多线程计时器 1:System.Threading.Timer 2:System.Timers.Timer   特殊目的的单线程计时器: 1:System.Windows.Forms.Timer(Windows Forms Timer) 2:System.Windows.Threading.DispatcherTimer(WPF

tianjin1986lin的专栏 3726

ROS2实战:从零部署Cartographer激光SLAM系统

本文详细介绍了在ROS2 Humble环境下,从零开始部署Cartographer激光SLAM系统的完整实战流程。内容涵盖环境准备、Cartographer安装(APT与源码编译两种方式对比)、工作空间与功能包创建、核心启动文件与Lua配置文件编写、系统构建与可视化启动,以及地图保存与实战调参技巧,帮助开发者快速构建稳定可靠的机器人SLAM应用。

weixin_29213655的博客 248

水文地质人必备:用Origin Pro 2023手把手教你搞定Piper三线图(附数据模板)

本文详细介绍了如何使用Origin Pro 2023绘制专业级Piper三线图,适用于水文地质数据分析。从数据准备、百分比计算到图表参数设置,提供全流程指导,并附赠数据模板和样式预设文件,帮助用户快速掌握这一水文地球化学分析的核心工具。

weixin_30568591的博客 533

c#: 四种定时器

环境: window 10 vs2016 16.5.1 .netcore 3.1.1 实验目的: 实验c#中的多线程定时器和单线程定时器 参照: 深入浅出多线程系列之七:4种定时器 在Framework中存在着4种定时器:其中分为两类:多线程计时器和特殊目的的单线程计时器。多线程计时器比较强大,精确,而且可扩展性强;单线程计时器比较安全,对于更新 Windows Forms controls或...

火焰 7108

3台虚拟机部署Doris详细文档(含校验步骤)

摘要:本文详细介绍了Apache Doris在3台虚拟机上的集群部署方案。采用1主FE+1从FE+1观察者FE+3BE的混合部署模式,确保元数据高可用性。硬件配置建议测试环境4核16GB内存,生产环境8核64GB内存。部署步骤包括系统环境配置(关闭防火墙、内核参数优化)、FE/BE节点配置启动、集群初始化验证等。重点配置了IP白名单(172.30.0.115)和数据目录(/data/doris)。通过MySQL客户端和WebUI可监控集群状态,实现千万级数据的实时分析能力,后续可通过增加BE节点线性扩展。

weixin_41026747的博客 933

20-认识RGB七彩灯 | Mixly技巧系列

Mixly 是由北师大米思齐团队开发的图形化编程软件,自发布以来深受国内创客圈的喜爱。Mixly 编程软件采用图形化编程,不用记代码,只需要拖拽、简单设置,就能让你快速完成创意电子编程。本...

铁熊玩创客 2134

stc8g1k08硬件iic读取aht20温湿度及0.91寸oled显示

使用stc8g1k08读取aht20温湿度及0.91寸oled显示。

qq_61688416的博客 2771

AI人工智能领域多模态大模型的数字孪生应用

本文旨在系统性地介绍多模态大模型在数字孪生领域的最新应用进展,探讨其技术原理、实现方法和应用价值。内容范围涵盖从基础概念到前沿技术,从理论分析到实践案例。文章首先介绍多模态大模型和数字孪生的基本概念,然后深入分析两者的结合点,接着通过具体案例展示应用实践,最后探讨未来发展趋势和挑战。多模态大模型:能够同时处理和融合多种数据模态(如文本、图像、视频、音频等)的大型人工智能模型数字孪生:物理实体或系统的虚拟副本,通过实时数据同步实现虚实交互跨模态融合:将不同数据模态的信息进行有效整合和关联的技术。

AI云原生与云计算技术学院 1325

21-玩转RGB七彩灯 | Mixly技巧系列

Mixly 是由北师大米思齐团队开发的图形化编程软件,自发布以来深受国内创客圈的喜爱。Mixly 编程软件采用图形化编程,不用记代码,只需要拖拽、简单设置,就能让你快速完成创意电子编程。本...

铁熊玩创客 1341

基于STM32F103设计的智能门锁(支持多种开锁解锁方式)

这个智能锁模型是基于STM32平台开发的,支持多种开锁方式。其中,一种是使用RC522射频卡读卡器读取IC卡卡号和内部数据,并验证身份后开锁;另一种是通过连接蓝牙地址来确认业主身份,实现了蓝牙自动开锁功能;最后一种是通过ESP8266连接腾讯云物联网平台,并且用户可以通过微信小程序“腾讯连连”进行远程开锁和关锁。这样,用户就可以选择最方便的方式来进行开锁操作了。

3万+

“深入浅出”系列之QT:(4)多线程编程

Qt提供了一套完善的多线程支持,包括线程类(QThread)、信号与槽机制(用于线程间通信)、互斥锁(QMutex)、读写锁(QReadWriteLock)、条件变量(QWaitCondition)等。避免在GUI线程中执行耗时操作:Qt的GUI组件不是线程安全的,因此应该在单独的线程中执行耗时操作,并通过信号与槽机制将结果传递回GUI线程进行更新。由于Qt中的信号与槽机制是线程安全的,因此它非常适合用于线程间通信。可以在一个线程中发出信号,然后在另一个线程中接收该信号并执行相应的槽函数。

weixin_65589140的博客 494

openlayers全面教程306+【目录】

vue+openlayers系列教程旨在为开发者提供简单快捷的示例。在每一个示例中,解释相应的API知识点。

大剑师兰特的GIS世界 2万+

机器人中的数值优化(二十一)—— 伴随灵敏度分析、线性方程组求解器的分类和特点、优化软件

本系列文章主要是我在学习《数值优化》过程中的一些笔记和相关思考,主要的学习资料是深蓝学院的课程《机器人中的数值优化》和高立编著的《数值最优化方法》等,本系列文章篇数较多,不定期更新,上半部分介绍无约束优化,下半部分介绍带约束的优化,中间会穿插一些路径规划方面的应用实例

慕羽★的博客 4205

JavaEE-多线程初阶4

阻塞队列,定时器,线程池

qq_63983125的博客 2157

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

12-Scoop多线程 | Mixly技巧系列

Mixly 是由北师大米思齐团队开发的图形化编程软件,自发布以来深受国内创客圈的喜爱。Mixly 编程软件采用图形化编程,不用记代码,只需要拖拽、简单设置,就能让你快速完成创意电子编程。本...

铁熊玩创客 3600

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

22-玩转RGB七彩灯条、灯带、灯环 | Mixly技巧系列

Mixly 是由北师大米思齐团队开发的图形化编程软件,自发布以来深受国内创客圈的喜爱。Mixly 编程软件采用图形化编程,不用记代码,只需要拖拽、简单设置,就能让你快速完成创意电子编程。本...

铁熊玩创客 4354

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

上一篇: ubuntu14.04 的ibus不能卸载(安装fcitx输入法框架时可能有这个需求)。出现无system setting实用程序
下一篇: 抓取国家统计局网站上的最新县及县以上行政区划代码,并保存成json格式的文件
fighter_yy
博客等级 码龄20年 22粉丝 8原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值