首页 > 编程语言 >C#中种常用的计时器

C#中种常用的计时器

时间:2022-10-12 23:34:14浏览次数:65  
标签:C# System Timer Elapsed 中种 计时器 事件 线程

1、System.Timers.Timer和System.Windows.Forms.Timer,它的最低识别为1/18s。

2、timeGetTime,他的最低识别能达到5ms。

3、System.Environment.TickCount,它最低识别为毫秒级。

4、QueryPerformanceCounter,它最低识别为1ms。

 

System.Timers.Timer

​System.Object​​​  ​​System.MarshalByRefObject​​    ​​System.ComponentModel.Component​​      System.Timers.Timer

在应用程序中生成定期事件。

Timer 组件是基于服务器的计时器,它使您能够指定在应用程序中引发 ​​Elapsed​​事件的周期性间隔。 然后可通过处理这个事件来提供常规处理。 例如,假设您有一台关键性服务器,必须每周 7 天、每天 24 小时都保持运行。 可以创建一个使用 Timer 的服务,以定期检查服务器并确保系统开启并在运行。 如果系统不响应,则该服务可以尝试重新启动服务器或通知管理员。

基于服务器的 Timer 是为在多线程环境中用于辅助线程而设计的。 服务器计时器可以在线程间移动来处理引发的 ​Elapsed​ 事件,这样就可以比 Windows 计时器更精确地按时引发事件。

基于 ​​Interval​​​属性的值,Timer 组件引发 ​​Elapsed​​事件。 您可以处理这个事件来执行必要的处理。 例如,假设您有一个联机销售应用程序,它持续向一个数据库投递销售订单。 编译要传送的指令的服务成批处理订单,而不是单独地处理每份订单。 可以使用 Timer 每 30 分钟启动一次批处理。

注意

当 ​​AutoReset​​​设置为 false 时,Timer 只在第一个 ​​Interval​​​过后引发一次 ​​Elapsed​​​事件。 若要保持以 ​​Interval​​​时间间隔引发 ​​Elapsed​​​事件,请将 ​​AutoReset​​设置为 true。

在 .NET Framework 2.0 版及更早版本中,Timer 组件捕获 ​​Elapsed​​事件的事件处理程序所引发的所有异常并禁止显示这些异常。 在将来的 .NET Framework 版本中,此行为可能会有更改。

如果 ​​SynchronizingObject​​​属性为 null,则在 ​​ThreadPool​​​线程上引发 ​​Elapsed​​​事件。 如果 ​​Elapsed​​​事件的处理时间比 ​​Interval​​​长,在另一个 ​​ThreadPool​​线程上将会再次引发此事件。 在这种情况下,事件处理程序应当是可重入的。

注意

在一个线程调用 ​​Stop​​​方法或将 ​​Enabled​​​属性设置为 false 的同时,可在另一个线程上运行事件处理方法。 这可能导致在计时器停止之后引发 ​​Elapsed​​​事件。 ​​Stop​​方法的代码示例演示了一种避免此争用条件的方法。

即使 ​​SynchronizingObject​​​不是 null,​​Elapsed​​​在 ​​Dispose​​​或 ​​Stop​​​方法调用后或​​Enabled​​​属性设置为 false 后,事件可以发生,这是因为引出 ​​Elapsed​​​事件的信号总是排队等待执行线程池线程。 解决此争用条件的一种方法是:设置一个标志,通知​​Elapsed​​事件的事件处理程序忽略随后的事件。

如果您使用 Timer 与用户界面元素如窗体或控件,没有放置计时器的该用户界面元素,指定包含 Timer 窗体或控件到 ​​SynchronizingObject​​属性,以使该事件封送到用户界面线程。

Timer 在运行时是不可见的。

有关 Timer 的实例的初始属性值列表,请参见 ​​Timer​​构造函数。

注意

应用到此类型或成员的 ​​HostProtectionAttribute​​​特性具有以下 ​​Resources​​属性值:Synchronization | ExternalThreading。​​HostProtectionAttribute​​​不影响桌面应用程序(桌面应用程序一般通过双击图标、键入命令或在浏览器中输入 URL 启动)。有关更多信息,请参见 ​​HostProtectionAttribute​​​类或 ​​SQL Server 编程和宿主保护特性​​。

例子Timer1

 

System.Windows.Forms.Timer

​System.Object​​​  ​​System.MarshalByRefObject​​    ​​System.ComponentModel.Component​​      System.Windows.Forms.Timer

Timer 用于以用户定义的事件间隔触发事件。 Windows 计时器是为单线程环境设计的,其中,UI 线程用于执行处理。 它要求用户代码有一个可用的 UI 消息泵,而且总是在同一个线程中操作,或者将调用封送到另一个线程。

使用此计时器时,请使用 ​​Tick​​​事件执行轮询操作,或在指定的时间内显示启动画面。 每当 ​​Enabled​​​属性设置为 true 且 ​​Interval​​​属性大于 0 时,将引发 ​​Tick​​​事件,引发的时间间隔基于 ​​Interval​​属性设置。

此类提供用于设置时间间隔以及启动和停止计时器的方法。

注意

Windows 窗体 Timer 组件是单线程组件,精度限定为 55 毫秒。 如果您需要更高精度的多线程计时器,请使用 ​​System.Timers​​​命名空间中的 ​​Timer​​类。

例子Timer2

 

后面的适用于计时

QueryPerformanceCounter  &

timeGetTime  &

System.Environment.TickCount

最高分辨率计时器

可用于查明代码性能瓶颈。

启动值: 3516284.3498
结束值: 3516284.3521
QueryPerformanceCounter 最小分辨率: 1/1193182 秒
API 开销: 1.92761875388667E-05 秒

GetTickCount 最小分辨率: 10 ms
timeGetTime 最小分辨率: 10 ms

龙腾一族至尊龙骑



标签:C#,System,Timer,Elapsed,中种,计时器,事件,线程
From: https://blog.51cto.com/u_15693505/5751878

相关文章

  • 5 个 TypeScript 库来改进你的代码
    5个TypeScript库来改进你的代码技术爬行之旅2022年09月22日08:57 ·  阅读2060我正在参加「掘金·启航计划」!在过去的几年里,TypeScript 语言除了增长......
  • C#运算符大全_各种运算符号的概述及作用
    以下是对C#中各种运算符号的说明及作用进行了详细的总结介绍一、[]方括号([])用于数组、索引器和属性,也可用于指针。1、数组类型是一种后跟[]的类型:int[]fib=newint......
  • C#中的@符号
    C#中的@符号C#中的@符号其实有很多的用法,我们来看看@有什么神奇之处。1.限定字符串用@符号加在字符串前面表示其中的转义字符“不”被处理。如果我们写一个文件的路......
  • C#中的泛型详解
    泛型(generic)是C#语言2.0和通用语言运行时(CLR)的一个新特性。泛型为.NET框架引入了类型参数(typeparameters)的概念。类型参数使得设计类和方法时,不必确定一个或多个具体参数,其......
  • Linux中/etc/passwd配置文件解析
    /etc/passwd文件中的内容如下:文件内容非常规律,每行记录对应一个用户。每行用户信息都以":"作为分隔符,划分为7个字段。各个字段含义如下:用户名:方便用户记忆的代号(如r......
  • Linux apache的常见配置(2)功能模块管理
    说明:apache是一个模块化的软件,很多功能由一个个模块来提供的。动态加载模块:DSO(DynamicSharedObject)DynamicSharedObject,动态共享对象,加载动态模块配置,不需重启即......
  • 【施工中】2020 ICPC 上海(TeamVP)
    D-Walker小评赛后补题。赛时很容易的想到了二分,但是尴尬的点在于我们想的是对时间进行二分,然后分类讨论两个人的位置关系,这就导致代码很长,而且一直存在错误没有找......
  • 解决springBoot启动报错Failed to obtain JDBC Connection; nested exception is java
    FailedtoobtainJDBCConnection;nestedexceptionisjava.sql.SQLNonTransientConnectionException:CLIENT_PLUGIN_AUTHisrequired意思是获取JDBC连接失败,导致的......
  • Ceph使用---对接K8s集群使用案例
    一、环境准备让k8s中的pod可以访问ceph中rbd提供的镜像作为存储设备,需要在ceph创建rbd、并且让k8snode节点能够通过ceph的认证。k8s在使用ceph作为......
  • CSharp: Interpreter Pattern in donet core 3
     ///<summary>/// 解释器模式InterpreterPattern/// geovindu,GeovinDuedit///</summary>interfaceEmployee{///<sum......