美文网首页
异步编程(十二):计时器

异步编程(十二):计时器

作者: 曦航老袁 | 来源:发表于2019-02-21 12:27 被阅读0次

    在.NET BCL中有几个可用的Timer类,异步编程时通常使用的是System.Threading命名空间中的那个。有关此计时器类的重要事项:

    1. 计时器在每次时间到期之后回调一个方法。此方法必须是TimerCallback委托形式的,结构如下:
    void TimerCallback(object state)
    
    1. 当计时器到期后,系统会从线程池中的线程上开启一个回调方法,提供state对象作为其参数,并开始运行。
    2. 我们可以设置的计时器特性如下:
    • 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成员事件,每次时间到期就会发起这个事件。这个计时器可以运行在用户接口线程或工作者线程之上。

    相关文章

      网友评论

          本文标题:异步编程(十二):计时器

          本文链接:https://www.haomeiwen.com/subject/cwlryqtx.html