在.NET BCL中有几个可用的Timer类,异步编程时通常使用的是System.Threading命名空间中的那个。有关此计时器类的重要事项:
- 计时器在每次时间到期之后回调一个方法。此方法必须是TimerCallback委托形式的,结构如下:
void TimerCallback(object state)
- 当计时器到期后,系统会从线程池中的线程上开启一个回调方法,提供state对象作为其参数,并开始运行。
- 我们可以设置的计时器特性如下:
- duetime是回调方法首次调用的时间。如果被设置为特殊的值Timeout.Infinite,则计时器不会开始;如果设置为零,加调方法会立即调用。
- period是两次成功调用回调方法的时间间隔。如果它的值被设置为Timeout.Infinite,回调方法在首次调用后将不会再次调用。
- state可以是null或在每次回调方法执行时要传入的对象引用。
Timer类的构造方法接受回调方法接受回调方法名称、duetime、period、state作为参数。Timer有很多的构造方法,其中最为常用的形式如下:
Timer(TimerCallback callback, object state, uint duetime, uint period)
Timer对象被创建后,我们可以通过使用Change方法来改变它的duetime或period参数。
下面是一个使用计时器的完整示例。Main方法创建了一个计时器,2秒钟后它会首次运行调用回调方法,然后每隔1秒回调一次。回调方法只是输出包含调用次数的消息。
using System;
using System.Threading;
namespace Timers
{
class Program
{
int TimesCalled = 0;
void Display(object state)
{
Console.WriteLine($"{(string)state} {++TimesCalled}");
}
static void Main()
{
Program p = new Program();
Timer myTimer = new Timer(p.Display, "Processing timer event", 2000, 1000);
Console.WriteLine("Timer started.");
Console.ReadLine();
}
}
}
.NET BCL还提供了几个其他计时器类,每一个都有其各自的用途。
- System。Windows.Forms.Timer 这个类在Windows应用程序中使用,用来定期把WM_TIMER消息放到程序的消息队列中。当程序从队列获取消息后,它会在主用户接口线程中同步处理,这对Windows应用程序来说非常重要。
- System.Timers.Timer 这个类更复杂,它包含了很多的成员,使我们可能通过属性和方法来操作计时器。它还有一个Elapsed成员事件,每次时间到期就会发起这个事件。这个计时器可以运行在用户接口线程或工作者线程之上。
网友评论