.net中Timer的使用

Timer在两个类中存在System.ThreadingSystem.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其中一个构造函数包含四个参数,在这个例子中

  • TimerCbTimerCallback类型的回调,指定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中调用。

posted @ 2020-03-31 20:45  mosakashaka  阅读(542)  评论(0编辑  收藏  举报