计时器可以一种定时的方式异步的重复运行,这里简单的讲解举例一下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还提供其它的计时器类,以后有时间再说吧