C# 三个定时器区别

微软官方对C#常用定时器的解释:

  • System.Timers.Timer, 它将触发事件, 并定期在一个或多个事件接收器中执行代码。 类旨在用作多线程环境中基于服务器的组件或服务组件;它没有用户界面, 在运行时不可见。
  • System.Threading.Timer, 它按固定的时间间隔对线程池线程执行单个回调方法。 回调方法是在实例化计时器时定义的, 无法更改。 System.Timers.Timer与类一样, 此类应在多线程环境中用作基于服务器的或服务组件; 它没有用户界面, 在运行时不可见。
  • System.Windows.Forms.Timer(仅 .NET Framework) 是一个 Windows 窗体组件, 该组件在一个或多个事件接收器中定期执行事件并执行代码。 组件没有用户界面, 旨在在单线程环境中使用;它在 UI 线程上执行。

一、System.Windows.Forms.Timer

设置定时器的间隔时间1000毫秒:

timerWinForm.Interval = 1000;

启动定时器,等待1000毫秒后,触发事件,调用对应得事件接收器函数。

timerWinForm.Enabled = true;

假设定时器的事件接收器函数为:

Console.WriteLine("test");

System.Threading.Thread.Sleep(5000);

定时器启动一秒后,执行事件接收器函数。

接收器函数执行期间,不会响应定时器接收到的事件。

接收器函数执行结束后,定时器才再次接收事件。

二、System.Threading.Timer

使用回调方法,由线程池线程提供服务,使用TimerCallback类型的回调函数。

创建计时器时,可以指定在第一次执行方法之前要等待的时间,以及在后续执行之间等待的时间量(即执行周期)。可以使用Change方法更改截止时间和期限,或禁用计时器。如果线程池上的所有线程都被使用了,则回调函数需要排队。

三、System.Timers.Timer

固定时间触发一个事件信号,该事件调用事件接收器函数。

如果SynchronizingObject属性为空,那么Elapsed事件会在线程池中开启一个线程。如果Elapsed事件处理的时间大于间隔时间,事件信号也会在间隔时间后再次被触发,所以事件句柄应该是可重入的。

注意:事件处理运行在一个线程,同时在另外一个线程里面调用Stop方法或设置Enable属性变为false。这可能导致计时器停止后引发Elapsed事件。Stop方法的示例代码显示了一种避免这种竞争情况的方法。

即使SynchronizingObject属性不为null,如果设置为当前的From对象,则Elapsed事件只会在主线程中触发调用。在调用Dispose或Stop方法后或Enabled属性被设置为false后,Elapsed事件也可以发生,因为引发Elapsed事件的信号总是在线程池上的线程队列中排队。解决这种竞争条件的一个方法就是只用标志位。使用标志位判断是否需要忽略后续的事件。

此时等价于System.Windows.Forms.Timer

原文地址:https://www.cnblogs.com/merlinzjl/p/12037298.html

时间: 2024-11-11 23:51:59

C# 三个定时器区别的相关文章

C#三种定时器的实现

·关于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 Appli

cocos2dx三种定时器的使用

 cocos2dx三种定时器的使用以及停止schedule,scheduleUpdate,scheduleOnce 今天白白跟大家分享一下cocos2dx中定时器的使用方法. 首先,什么是定时器呢?或许你有时候会想让某个函数不断的去执行,或许只是执行一次,获取你想让他每隔几秒执行一次,ok,这些都可以统统交给定时器来解决. cocos2dx中有三种定时器:schedule,scheduleUpdate,scheduleOnce.了解其功能便会发现定时器真是太方便了,废话不多说,我们逐一学习一

cocos2dx三种定时器使用

 cocos2dx三种定时器的使用以及停止schedule.scheduleUpdate.scheduleOnce 今天白白跟大家分享一下cocos2dx中定时器的用法. 首先,什么是定时器呢?也许你有时候会想让某个函数不断的去运行.也许仅仅是运行一次,获取你想让他每隔几秒运行一次.ok.这些都能够统统交给定时器来解决. cocos2dx中有三种定时器:schedule,scheduleUpdate.scheduleOnce.了解其功能便会发现定时器真是太方便了,废话不多说,我们逐一学习一下

Objective-C三种定时器CADisplayLink / NSTimer / GCD的使用

OC中的三种定时器:CADisplayLink.NSTimer.GCD 我们先来看看CADiskplayLink, 点进头文件里面看看, 用注释来说明下 @interface CADisplayLink : NSObject { @private void *_impl; //指针 } + (CADisplayLink *)displayLinkWithTarget:(id)target selector:(SEL)sel;//唯一一个初始化方法 - (void)addToRunLoop:(NS

hive三种方式区别和搭建、HiveServer2环境搭建、HWI环境搭建和beeline环境搭建

说在前面的话 以下三种情况,最好是在3台集群里做,比如,master.slave1.slave2的master和slave1都安装了hive,将master作为服务端,将slave1作为服务端. hive三种方式区别和搭建 Hive中metastore(元数据存储)的三种方式: a)内嵌Derby方式 b)Local方式 c)Remote方式 1.本地derby这种方式是最简单的存储方式,只需要在hive-site.xml做如下配置便可<?xml version="1.0"?&g

iOS 中三种定时器的用法NSTimer、CADisplayLink、GCD

一.NSTimer 1. 创建方法 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO]; TimerInterval : 执行之前等待的时间.比如设置成1.0,就代表1秒后执行方法 target : 需要执行方法的对象. selector : 需要执行的方法 repeats : 是否需要循环 2.

iOS 计时器三种定时器的用法NSTimer、CADisplayLink、GCD

原文:http://www.cocoachina.com/ios/20160919/17595.html 一.三种计时器 二.全局倒计时 #import "ViewController.h" @interface ViewController () { CADisplayLink * displaylinked; } @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do

iOS三种定时器的用法NSTimer、CADisplayLink、GCD

一,NSTimer //创建方式1 NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(action:) userInfo:nil repeats:NO]; [timer invalidate]; //调用创建方法后,target对象的计数器会加1,直到执行完毕,自动减1.如果是循环执行的话,就必须手动关闭,否则可以不执行释放方法. //推荐-->创建方式2 NST

C#中三种定时器对象的比较

·关于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 Applicati