.net中Timer的使用
Timer在两个类中存在System.Threading
和System.Timers
,这两天使用的是第一个。
Timer定时器在.net中的线程池中运行。
立即运行Timer
Timer可以在创建的的时候立即运行
private static void Main(string[] args)
{
string msg = "Hello";
var t = new Timer(TimerCb, msg, 100, Timeout.Infinite);
Thread.Sleep(1000);
}
private static void TimerCb(object state)
{
System.Console.Out.WriteLine(state);
}
Timer其中一个构造函数包含四个参数,在这个例子中
TimerCb
:TimerCallback
类型的回调,指定Timer倒计时结束时,执行程序
TimerCallback
定义如下:public delegate void TimerCallback(object state);
msg
:传入的参数,object
类型,所以可以传入任何对象,调用时传入回调中- :第三个参数指定Timer在多长时间以后开始运行,单位是毫秒
Timeout.Infinite
:第四个参数指定Timer运行的间隔,如果需要反复运行,这里可以指定一个毫秒数。设定为Infinite则只会运行一次
先创建,后运行
private static void Main(string[] args)
{
var t = new Timer(TimerCb);
t.Change(100, 1000);
Thread.Sleep(2000);
}
private static void TimerCb(object state)
{
System.Console.Out.WriteLine(state);
}
Timer构造函数可以仅仅接收一个TimerCallback
类型的回调,之后通过(Timer.Change)方法,控制Timer运行。
在这个李自立,Timer被指定在100毫秒后运行,每1000毫秒(1秒)运行一次。
值得注意的是,在这种方式中,Timer中的参数state
会被传入该Timer对象本身。
回调传入多个参数
借助lambda表达式的匿名函数,可以简单的实现传入多个参数的Timer回调:
private static void Main(string[] args)
{
string msg1 = "Hello";
string msg2 = " World!";
var t = new Timer((state) =>
{
TimerCb(msg1, msg2);
});
t.Change(100, 1000);
Thread.Sleep(2000);
}
private static void TimerCb(string msg1, string msg2)
{
System.Console.Out.WriteLine(msg1 + msg2);
}
Timer创建时的回调,实际是套了一层壳,将变量传入了真正的回调TimerCb
中调用。