c#执行定时计算限制操作(计时器)
在.Net Framework Class Library(FCL)中,System.Threading命名空间下定义了一个Timer类,这就是常用的一个计时器。实际上FCL总共提供了如下几种计时器:
1、System.Threading.Timer
在实际的开发中,这个类出现和使用频率非常高,下面就重点谈谈它的一些基础概念和应用实例。
(1)、常用的构造器
1
public
Timer(TimerCallback callback,
object
state,
int
dueTime,
int
period);
2
public
Timer(TimerCallback callback,
object
state,
long
dueTime,
long
period);
3
public
Timer(TimerCallback callback,
object
state, TimeSpan dueTime, TimeSpan period);
4
public
Timer(TimerCallback callback,
object
state,
uint
dueTime,
uint
period);
参数说明:
a、callback:望文生意,肯定表示一个回调,它是标识希望由一个线程池线程回调的方法。当然它的类型必须和System.Threading.TimerCallback委托类型匹配,如下所示:
1
public
delegate
void
TimerCallback(
object
state);
b、state:每次调用回调方法,向回调方法传递的状态数据,如没有,可以为null;
c、dueTime:在首次调用回调方法之前要等待多少毫秒。如希望立刻调用回调方法,该参数指定为0即可。
d、period:指定了以后每次调用回调方法之前要等待多少毫秒(理解成下一次和本次调用的时间间隔即可)。如果为该参数传递Timeout.Infinite(或者直接写-1),线程池线程只调用回调方法一次(那也就没有必要用计时器了)。
(2)、基本工作原理
在内部(原文应该指CLR内),线程池为所有Timer对象只使用了一个线程。这个线程知道下一个Timer对象在什么时候到期(计时器还有多久触发)。下一个Timer对象到期时,线程就会唤醒,在内部调用ThreadPool的QueueUserWorkItem,将一个工作项添加到线程池的队列中,使你的回调方法得到调用。
注意:如果回调方法的执行时间很长,计时器可能在上个回调还没有完成的时候再次触发(对于执行时间很长的任务,实际开发中通常不使用线程池,而是直接使用new一个Thread)。这可能会造成多个线程池线程同时调用你的方法(方法的重叠覆盖?)。为了解决这个问题,Jeffrey Richter建议我们这样使用Timer:
a、为period指定Timeout.Infinite。这样,计时器就只触发一次;
b、在回调方法中,调用Timer的Change方法来指定一个新的dueTime,并再次为period指定Timeout.Infinite。Change方法的几个重载版本:
1
public
bool
Change(
int
dueTime,
int
period);
2
3
public
bool
Change(
long
dueTime,
long
period);
4
5
public
bool
Change(TimeSpan dueTime, TimeSpan period);
6
7
public
bool
Change(
uint
dueTime,
uint
period);
Timer还有一个Dispose方法,允许完全取消计时器。
(3)、示例代码
补充:软件开发 , C# ,
上一个:子窗体刷新父窗体使用接口模式
下一个:C#中的各种Access操纵总结