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