C#线程(五)计时器

6. 计时器

 计时器可以周期性的执行某个方法。

6.1. System.Threading.Timer

线程计时器利用了线程池,通过线程池定期执行某个方法,因此可以严格的定时执行某个方法。如果某个方法比较耗时,该计时器通过线程池技术保证定时出发该方法,只不过通过不同的线程来执行。

6.1.1. 常用方法

构造方法

public Timer (TimerCallback tick, object state, int dueTime , intperiod);

tick:一个返回值为void,参数为object的委托,也是计时器执行的方法。

state:计时器执行方法的的参数。

dueTime:调用 callback 之前延迟的时间量(以毫秒为单位)。

period:调用 callback 的时间间隔。

Change方法

bool Change (int dueTime, int period)

用来改变调用方法之前延迟的时间量和调用时间间隔。

Dispose方法

void Dispose()

用来关闭计时器,释放资源。

6.1.2. 应用举例

 

static void Main(string[] args)

{          

     Timer t = new Timer(tick,null, 1000, 2000);

     Console.ReadKey();       

}

 

static void tick(object ob)

{

    Console.WriteLine("Start");

     Thread.Sleep(5000);

    Console.WriteLine("End");

}

 

输出结果:

Start

Start

Start

End

Start

从上面的结果可以看出,定时器并没有阻塞在tick方法中。这是因为使用了线程池技术,从而保证在规定时间内定时执行时间。

6.2. System.Timers.Timer

System.Timers命名空间下的Timer类完全包装自System.Threading.Timer。

定义一个System.Timers.Timer对象,然后绑定Elapsed事件,通过Start()方法来启动计时,通过Stop()方法或者Enable=false停止计时。AutoReset属性设置是否重复计时(设置为false只执行一次,设置为true可以多次执行)。

6.2.1. 常用方法

构造方法

(1)public Timer()

默认初始值:

AutoReset:true

Enabled:false

Interval:100 毫秒

(2)public Timer(double interval)

参数代表设定间隔时间

Dispose方法

void Dispose()

用来关闭计时器,释放资源。

Start方法

void Start()

通过将 Enabled 设置为 true 开始引发 Elapsed 事件。

Stop方法

void Stop()

通过将 Enabled 设置为 false 停止引发 Elapsed 事件。

 

 

6.2.2. 常用属性

AutoReset

获取或设置一个布尔值,该值指示 Timer 是否应只引发一次 Elapsed 事件((false) 或重复 (true))。

 

Enable

获取或设置一个值,该值指示 Timer 是否应引发 Elapsed 事件。

 

Interval

获取或设置引发 Elapsed 事件的间隔(以毫秒为单位)。

6.2.3. 事件

Elapsed

用于绑定需要定时执行的方法

 

6.2.2. 应用举例

static void Main(string[] args)

{

     System.Timers.Timer t =new System.Timers.Timer(2000);

     t.AutoReset = true;

     t.Enabled = true;

     t.Elapsed += T_Elapsed;

     Console.ReadKey();       

}

 

private static void T_Elapsed(object sender,System.Timers.ElapsedEventArgs e)

{

    Console.WriteLine("Start");

     Thread.Sleep(5000);

    Console.WriteLine("End");

}

输出结果:

Start

Start

Start

End

Start

从上面的结果可以看出,定时器并没有阻塞在tick方法中。这是因为使用了线程池技术,从而保证在规定时间内定时执行时间。

 

6.3. System.Windows.Forms.Timer

System.Windows.Forms.Timer用法类似于System.Timers.Timer,但功能特性上有根本的不同。

System.Windows.Forms.Timer使用消息循环机制来取代线程池产生消息的机制。

这意味着Tick事件总是在创建timer的那个线程上执行,同时也意味着如果上一次Tick消息还未被处理,即使时间超过了间隔时间也要等待上一次Tick执行完毕才能执行下一次Tick

假定这是主线程——负责实例化所有Windows Forms程序中的forms和控件,计时器的事件能够操作forms和控件而不违反线程安全。它实质上是一个单线程timer

      Windows Forms计时器必须迅速地执行来更新用户接口。迅速地执行是非常重要的,因为Tick事件被主线程调用,如果它有阻塞,将使用户接口变的没有响应。

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页