.net中计时器Timer类

时间:2022-08-15 20:35:50

计时器可以一种定时的方式异步的重复运行,这里简单的讲解举例一下System.Threading命名空间中的Timer类。

参考文档:https://msdn.microsoft.com/zh-cn/library/system.threading.timer(v=vs.110).aspx

  • 计时器在固定的时间调用回调方法,回调方法必须是System.Threading.TimerCallback委托形式。他要求返回值必须为void并且接受衣蛾object类型作为参数。
  • 当计时器运行到设置的时间,系统会在线程池中的线程上开启一个回调方法,他提供一个state对象作为参数,然后开始运行。state:  一个包含回调方法要使用的信息的对象,可以为 null。
  • dueTime参数是回调方法callback首次被调用前的时间(以毫秒为单位)。dueTime设置为0,则callback回调函数立即被调用,如果设置为Timeout.Infinite,则计时器不会被开始。
  • period参数是调用回调方法callback的时间间隔(以毫秒为单位)。如果设置为Timeout.Infinite,首次调用之后可以禁用计时器。

下面模拟计时网页下载的时间:

using System;
using System.Diagnostics;
using System.Net;
using System.Threading;

namespace ConsoleApp.EX04
{
    class Program
    {
        static int TimesCalled = 0;
        static void Display(object state)
        {
            Console.WriteLine("{0} 用时{1}s", (string)state, ++TimesCalled);
        }
        static void Main(string[] args)
        {
            Stopwatch watch = new Stopwatch();
            watch.Start();
            Timer timer = new Timer(Display, "正在下载网站", 1000, 1000);
            Console.WriteLine("Timer开始计时{0,4:N0}ms", watch.Elapsed.TotalMilliseconds);
            WebClient wc = new WebClient();
            var task = wc.DownloadStringTaskAsync("https://www.infoq.com/springnet/");
            task.Wait();
            if (task.IsCompleted)
            {
                timer.Change(Timeout.Infinite, Timeout.Infinite);
                Console.WriteLine("下载完成,耗时{0,4:N0}ms", watch.Elapsed.TotalMilliseconds);
            }
            Console.ReadKey();
        }
    }
}

运行的结果如下:

Timer开始计时   1ms
正在下载网站 用时1s
正在下载网站 用时2s
正在下载网站 用时3s
正在下载网站 用时4s
正在下载网站 用时5s
正在下载网站 用时6s
下载完成,耗时6,139ms

.NET还提供其它的计时器类,以后有时间再说吧