C# 异步编程(计时器)

计时器

计时器提供了另外一种定期重复运行异步方法的方式。尽管在.NET BCL中有好几个可用的

Timer类,但这里只会介绍system.Threading命名空间中的那个。

有关计时器类需要了解的重要事项如下所示。

  • 计时器在每次到期之后调用回调方法。回调方法必须是TimerCallback委托形式的,结构
    如下所示。它接受一个object类型的参数,并且返回类型是void。
    voidTimerCallback(Object state)
  • 当计时器到期之后,系统会在线程池中的一个线程上设置回调方法,提供state对象作为
    其参数,并且开始运行。
  • 可以设置的计时器的一些特性如下。
    • dueTime是回调方法首次被调用之前的时间。如果dueTime被设置为特殊的值Timeout.lnfinite,则计时器不会开始;如果被设置为0,则回调函数会被立即调用。
    • period是两次成功调用回调函数之间的时间间隔。如果它的值被设置为umeout.lnfinite,
      则回调在首次被调用之后不会再被调用。
    • state可以是null或在每次回调方法执行时要传入的对象的引用。

Timer类的构造函数接受回调方法名称、dueTime、period以及state作为参数。Timer有很

多构造函数,最为常用的形式如下:

csharp 复制代码
Timer(TimerCallback callback,object state,uint dueTime,uint period)

如下代码语句展示了一个创建Timer对象的示例:

csharp 复制代码
Timer myTimer=new Timer(MyCallback,someObject,2000,1000);

一旦Timer对象被创建,我们可以使用change方法来改变它的dueTime或period方法。

如下代码给出了一个使用计时器的示例。Main方法创建了一个计时器,2秒钟之后它会首次

调用回调,然后每隔1秒再调用1次。回调方法只是输出了一条包含其调用次数的消息。

csharp 复制代码
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();
        }
    }
}

.NETBCL还提供了其他几个计时器类,每一个都有其用途。其他计时器类如下所示。

  • System.Windows.Forms.Timer这个类在Windows Forms应用程序中使用,用来定期把
    WM_TIMER消息放到程序的消息队列中。当程序从队列获取消息后,它会在主用户接口线
    程中同步处理程序,这对WindowsForms应用程序来说非常重要。
  • System.Timers.Timer这个类更复杂,它包含了很多成员,使我们可以通过属性和方法
    来操作计时器。它还有一个叫作Elapsed的成员事件,每次时间到就会触发。这个计时器
    可以运行在用户接口线程或工作线程上。
相关推荐
吃一碗粉只付一碗钱5 小时前
12-给SPA友好的401和403响应
c#·状态模式
第九序言T5 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
龙亘川6 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人6 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas1007 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
专注仿真8 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
jimy18 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
呆呆虫129 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心疼你的一切9 小时前
Python自动发邮件实战定时发报表
大数据·开发语言·python
Wang's Blog10 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友