C#中timer类

C#中定时器停止问题 C#中定时器停止问题,停止定时器必须要用Stop方法才行,不然依然会工作的。 立即下载

关于C#中timer类     在C#里关于定时器类就有3个      
1.定义在System.Windows.Forms里      
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,完全取代上面的Timer控件。它们的缺点是不支持直接的拖放,需要手工编码。  
例:  
使用System.Timers.Timer类  
System.Timers.Timer   t   =   new   System.Timers.Timer(10000);//实例化Timer类,设置间隔时间为10000毫秒;  
t.Elapsed   +=   new   System.Timers.ElapsedEventHandler(theout);//到达时间的时候执行事件;  
t.AutoReset   =   true;//设置是执行一次(false)还是一直执行(true);  
t.Enabled   =   true;//是否执行System.Timers.Timer.Elapsed事件;  
public   void   theout(object   source,   System.Timers.ElapsedEventArgs   e)  
{  
MessageBox.Show( "OK! ");  
}      


关于定时器
定时器是个很有意思的东西,它很有用,但我认为这不是现代计算机的结构所擅长的事情。
计算机适合做那些很大量的简单重复工作,或者根据请求做出回应。
DOS时代是没有进程线程等概念的,那时候要想做到定时真是有些麻烦
通常的做法是死循环不断监测时间,发现时间到了就做特定的事情
当然你可以用delay,来指定等待多长时间,但是如果你一边要响应用户的操作,比如输入,一边要定时做些
事情就是一件麻烦的事了
当然有些人可以这样做,截取系统的时钟中断(我忘了中断号是多少了),每秒钟有18.2次
当这些做法都不是很优雅。但DOS时代只能这样凑合着了
Windows是个伟大的进步,系统提供了Timer支持,但是问题是这个定时器并不准时而且有时候根本不能用。
Win32   API中有个SetTimer函数,可以为一个窗口创建一个定时器,这个定时器会定时产生消息WM_TIMER也可以调用
指定的回调函数,其实这都是一样的,因为都是单线程的。
单线程的定时器会有很多问题,首先是不准时,定时器只是定时把消息WM_TIMER访到线程的消息队列里,但是并不保证消息会立刻被响应,如果
碰巧系统比较忙,那么消息可能会在队列里放一端时间才被响应,还会造成本来应该间隔一段时间发生的消息响应连续发生了
解决方法通常是
OnTimer(...)
{
  //Timer   process.....
 
  MSG   msg;
  While(PeekMessage(&msg,   m_hWnd,   WM_TIMER,   WM_TIMER,   PM_REMOVE));
}
在当前Timer处理中,把消息队列里的WM_TIMER消息,清除掉。
更糟的是如果你不去调用GetMessage,那么就不会有Timer发生了。
这个问题直到win   xp都没什么改变,似乎微软并不打算在Win32   API中解决这个问题了。
.NET   Framework为我们带来了新的解决方案
.NET   Framework提供三种Timer
Server   Timers                 System.Timers.Timer
Thread   Timers               System.Threading.Timer  
Windows   Timers       System.Windows.Forms.Timer
其中Windows   Timers只是提供了和WinAPI   一样的Timer,仍然是基于消息,仍然是单线程
其它两个就不同了,他们是基于线程池的Thread   Pool,这样最大的好处在于,产生的时间间隔准确均匀。
Server   Timers     和   Thread   Timers   的不同在于ServerTimers   是基于事件的,Thread   Timers是基于回调函数
我更喜欢Thread   Timer,比较轻量级方便易用。
但是这样的Timer也有问题,就是由于时多线程定时器,就会出现如果一个Timer处理没有完成,到了时间下一个
照样会发生,这就会导致重入问题
对付重入问题通常的办法是加锁,但是对于   Timer却不能简单的这样做,你需要评估一下
首先Timer处理里本来就不应该做太需要时间的事情,或者花费时间无法估计的事情,比同远方的服务器建立一个网络连接,这样的做法尽量避免
如果实在无法避免,那么要评估Timer处理超时是否经常发生,如果是很少出现,那么可以用lock(Object)的方法来防止重入
如果这种情况经常出现呢?那就要用另外的方法来防止重入了
我们可以设置一个标志,表示一个Timer处理正在执行,下一个Timer发生的时候发现上一个没有执行完就放弃执行
static     int   inTimer   =   0;
public   static   void   threadTimerCallback(Object   obj)
{
          if   (   inTiemr   ==   0   )
        {
                  inTimer   =   1;                  
                  Console.WriteLine( "Time:{0},   /tThread   ID:{1} ",   DateTime.Now,   Thread.CurrentThread.GetHashCode());
                  Thread.Sleep(2000);
                  inTimer   =   0;
            }
}
但是在多线程下给inTimer赋值不够安全,还好Interlocked.Exchange提供了一种轻量级的线程安全的给对象赋值的方法
  static   int   inTimer   =   0;
  public   static   void   threadTimerCallback(Object   obj)
  {
              if   (   Interlocked.Exchange(ref   inTimer,   1)   ==   0   )
            {
                      Console.WriteLine( "Time:{0},   /tThread   ID:{1} ",   DateTime.Now,   Thread.CurrentThread.GetHashCode());
                      Thread.Sleep(250);
                      Interlocked.Exchange(ref   inTimer,   0);
            }
  }


正确的选择使用.NET中的三个Timer  
Timer这个类在.NET的类库中有三个:

1)System.Threading.Timer  

            是一个使用回调方法的计时器,而且由线程池线程服务,简单且对资源要求不高。

2)System.Windows.Forms.Timer  

          这是一个必须和Windows窗体一起使用的Timer。

3)System.Timers.Timer

            基于服务器计时器功能的Timer,根据服务器系统时间进行运行的Timer。如果需要写Windows   Services的话可以使用这个Timer来进行一

些需要在一定间隔时间进行某项操作的环境下使用。
            它使您能够指定在应用程序中引发   Elapsed   事件的周期性间隔。然后可以操控此事件以提供定期处理。例如,假设您有一台关键性服务

器,必须每周   7   天、每天   24   小时都保持运行。可以创建一个使用   Timer   的服务,以定期检查服务器并确保系统开启并在运行。如果系统不

响应,则该服务可以尝试重新启动服务器或通知管理员。基于服务器的   Timer   是为在多线程环境中用于辅助线程而设计的。服务器计时器可

以在线程间移动来处理引发的   Elapsed   事件,这样就可以比   Windows   计时器更精确地按时引发事件。

windows下时钟中断程序示例 windows下简单的时钟中断程序,timeSetEvent(1000, 1, TimeProc, 0, TIME_PERIODIC);,回调函数为TimePro。 立即下载

相关推荐

电机系列(1) - foc最基本原理、clark变换 、park变换、附代码

什么是FOC? FOC(Field-Oriented Control),直译是磁场定向控制,也被称作矢量控制 (VC,Vector Control) ,是目前无刷直流电机(BLDC)和永磁同步电机(PMSM)高效控制的最优方法之一。FOC旨在通过精确地控制磁场大小与方向,使得电机的运动转矩平稳、噪声小、效率高,并且具有高速的动态响应。 简单来说就是,FOC是一种对无刷电机的驱动控制方法,它可以让我们对无刷电机进行 “像素级” 控制,实现很多传统电机控制方法所无法达到的效果。 因为所谓的“矢量控制”其实就是

nepqiu的博客 7万+

C# Timer定时器的用法(定时器的终止)

System.Timers.Timer query_interval = new System.Timers.Timer(7000);//查询间隔定时器,实例化Timer类,设置间隔时间为7000毫秒;

ZHM977863924的专栏 1万+

ZYNQ RFSoC 的DAC如何做到从 0到Fs频段 信号输出

之前一直没太了解 RFSoC 的DAC如何输出在 Fs/2 到 Fs 频率范围内的信号,例如 ZCU216中的 ZU49DR,其RF-DAC最大采样率是 9.85GSPS,如果想输出的信号中心频率在5.8G,它是如何有效输出在第二奈奎斯特区域范围的信号的。

weixin_44630490的博客 1551

第三篇 SG90舵机和HC-SR04测距

目录 一、SG90舵机 1、PWM 2、占空比 3、输出PWM的方式 4、编程实现舵机0-135°转动(demo1.c) 二、HC-SR04测距 1、测距原理 2、测距实现(demo2.c) 一、SG90舵机 SG90舵机的控制信号是PWM信号,利用占空比的变化,改变舵机转动的角度。 1、PWM 脉冲宽度调制 (Pulse Width Modulation)<详细解释见百度> 2、占空比 一个周期内,高电平占据时长的百分比 3、输出PWM的方式 🔖硬...

AF_INET6的博客 2384

使用电荷放大器处理压电加速度计输出

电阻器 R p模拟传感器的绝缘电阻,为产生的电荷创建泄漏路径。在此图中,顶部波形显示传感器产生的电荷,而底部波形显示电荷放大器的输出。这需要具有大输入阻抗的放大级,以防止产生的电荷通过与传感元件并联的放大器的输入阻抗泄漏。换句话说,电荷放大器补偿传感器产生的电荷 q p ,反馈电容器 C F中具有相反极性的等量电荷。因此,任何与传感器并联的绝缘电阻,如电缆的绝缘电阻或传感器的漏电电阻Rp,都不能流过电流。漂移是指电荷放大器输出在一段时间内发生的变化,而不是由被测物理参数的变化(我们讨论的加速度)引起的。

weixin_45260069的博客 3905

axi ps读写pl_PL读写DDR:Datamover能干什么

最近发现工程项目中一直在用AXI-DMA。这玩意儿搬数据倒是没问题,就是用axi-lite配置起来非常反人类。。。简单的办法其实是用datamover ip核。这个ip核能干嘛呢。准备写个文章解析一下。由于好多feature没用过,所以仅仅看文档可能理解有误,欢迎指出错误。首先扫个盲:MM2S指的是Memory map to stream. 读DDR. S2MM指的是steam to memory...

weixin_35908791的博客 1597

定时器中断

编译无误后烤录既可实现定时器中断功能。引用头文件并写入定时器句柄。新建btim.c文件。

m0_75239664的博客 472

电路仿真软件PSIM简介

PSIM的基本使用操作...

qq_55203246的博客 7175

C#中timer类的用法

C#中timer类的用法 C#中timer类的用法 关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Timers.Timer类里 System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windo...

earthwalkerhwattnet的专栏 1286

【智能制造】- APS系列|05 APS 排产的五大底层算法逻辑

很多人误以为APS只是给生产工单排先后顺序,实则整套系统依托成熟算法体系,完成多维度约束下的最优生产决策在制造业数字化排产普及的当下,依旧有不少制造管理者对APS存在认知误区,将其等同于简易工单排序工具。事实上,专业级高级计划与排程系统,早已脱离单纯按时间排序的基础功能,而是依托一整套成熟完善的底层算法逻辑,整合现场各类生产限制条件,在海量变量中自动推演、筛选、输出最贴合企业经营目标的生产方案。

qq_40821260的博客 433

高通Camera HAL3调试实战:如何用camxoverridesettings.txt高效抓取日志与dump图像数据

本文深入探讨了高通Camera HAL3调试中camxoverridesettings.txt文件的高效应用,重点介绍了如何通过该文件精准控制日志输出级别与dump图像数据,帮助开发者快速定位移动影像系统中的问题。文章详细解析了日志分级配置、图像数据捕获技巧及典型问题排查流程,为高通Camera HAL3项目开发提供了实用技术点。

weixin_30315905的博客 861

c#的Timer类

c#的Timer类(转载) 2009-10-04 12:52 关于C#中timer类 在C#里关于 定时器类就有3个   1.定义在System.Windows.Forms里   2.定义在System.Threading.Timer类里   3.定义在System.Timers.Timer类里 System.Windows.Forms.Timer是应用于Wi

zzy7075的专栏 1226

为什么 CL_DEMO_OUTPUT 不能用于生产用途:不仅是 demo 标签那么简单

摘要:CL_DEMO_OUTPUT 虽能快速展示ABAP数据,但存在严重生产风险:1) 官方定位为示例工具,不承诺兼容性与支持;2) 非Released API,云环境直接不可用;3) 依赖SAP GUI,缺乏日志关键特性;4) 存在版本漂移、类型限制、性能隐患及安全缺口。典型事故案例包括后台Job崩溃、Gateway链路污染和云迁移失败。生产环境应改用结构化日志(如SLG1)或稳定API输出,避免将调试工具误作工程方案。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 131

C# Timer类

C# 有三种不同的Timer类 1.Threading.Timer 2.Timer.Timer 3.Forms.Timer

changtianshuiyue的专栏 2496

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

关于C#中timer类

·关于C#中timer类 在C#里关于定时器类就有3个 1.定义在System.Windows.Forms里 2.定义在System.Threading.Timer类里 3.定义在System.Timers.Timer类里 System.Windows.Forms.Timer是应用于WinForm中的,它是通过Windows消息机制实现的,类似于VB或Delphi中的Timer控件,内部使...

weixin_34062469的博客 119

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

上一篇: (转)ADO.NET中的多数据表操作浅析之读取方案
下一篇: System.Timers
boby16
博客等级 码龄21年 18粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值