我目前正在开发一个对时间敏感的程序,在这一点上重要的一点是,我每秒都要从设备读取一次.

我目前正在为此使用一个计时器,但是我发现时间稳定会增加1 ms pr滴答的间隔.由于程序将长时间运行,因此可能会导致问题.

读取执行时间是代码执行所需的时间.

在每个已发生的事件开始时都执行读取.

我如何确保时钟不会增加,我可以理解滴答声可能不在精确的毫秒上,但是我一直在爬升似乎很奇怪.而且我的代码并不需要花费整整1000毫秒的时间来执行,事实并非如此. 16.6分钟后,读数将被推一整秒.

Read Exe Time: 574.0637 ms

Performing reading: 22:58:39.696

Read Exe Time: 571.9422 ms

Performing reading: 22:58:40.697

Read Exe Time: 595.5333 ms

Performing reading: 22:58:41.697

Read Exe Time: 566.2602 ms

Performing reading: 22:58:42.698

Read Exe Time: 568.2275 ms

Performing reading: 22:58:43.698

Read Exe Time: 569.7573 ms

Performing reading: 22:58:44.700

Read Exe Time: 561.655 ms

Performing reading: 22:58:45.701

Read Exe Time: 567.8385 ms

Performing reading: 22:58:46.702

Read Exe Time: 584.8305 ms

Performing reading: 22:58:47.703

Read Exe Time: 588.754 ms

Performing reading: 22:58:48.703

Read Exe Time: 560.8154 ms

Performing reading: 22:58:49.704

Read Exe Time: 567.9324 ms

Performing reading: 22:58:50.705

Read Exe Time: 579.1354 ms

Performing reading: 22:58:51.706

Read Exe Time: 563.0227 ms

Performing reading: 22:58:52.707

Read Exe Time: 569.557 ms

Performing reading: 22:58:53.708

Read Exe Time: 560.707 ms

Performing reading: 22:58:54.708

Read Exe Time: 574.6268 ms

Performing reading: 22:58:55.709

Read Exe Time: 570.4872 ms

Performing reading: 22:58:56.710

Read Exe Time: 574.8388 ms

Performing reading: 22:58:57.710

Read Exe Time: 573.2054 ms

Performing reading: 22:58:58.710

Read Exe Time: 578.6189 ms

Performing reading: 22:58:59.711

Read Exe Time: 565.7442 ms

Performing reading: 22:59:0.711

Read Exe Time: 564.7523 ms

Performing reading: 22:59:1.712

Read Exe Time: 575.8134 ms

Performing reading: 22:59:2.713

Read Exe Time: 570.9416 ms

Performing reading: 22:59:3.713

Read Exe Time: 573.1493 ms

Performing reading: 22:59:4.714

Read Exe Time: 570.2831 ms

Performing reading: 22:59:5.714

Read Exe Time: 568.2672 ms

Performing reading: 22:59:6.715

Read Exe Time: 586.5607 ms

Performing reading: 22:59:7.715

Read Exe Time: 588.0465 ms

Performing reading: 22:59:8.715

Read Exe Time: 574.1118 ms

Performing reading: 22:59:9.716

编码

private void StartMeter()

{

this.Meter.Start();

this.ReadingTime = new Timer(1000);

this.ReadingTime.Elapsed += new ElapsedEventHandler(PerformReading);

this.ReadingTime.Start();

}

private void PerformReading(object sender, ElapsedEventArgs e)

{

Console.WriteLine("Performing reading: " + DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + "." + DateTime.Now.Millisecond);

// Code here

}

更新:

如果我只是将时间设置为999毫秒,它将逐渐减少

Performing reading: 23:4:50.527

Read Exe Time: 562.7729 ms

Performing reading: 23:4:51.527

Read Exe Time: 566.8178 ms

Performing reading: 23:4:52.527

Read Exe Time: 562.3829 ms

Performing reading: 23:4:53.526

Read Exe Time: 567.9165 ms

Performing reading: 23:4:54.526

Read Exe Time: 561.1329 ms

Performing reading: 23:4:55.525

Read Exe Time: 562.9359 ms

Performing reading: 23:4:56.525

Read Exe Time: 560.4151 ms

Performing reading: 23:4:57.524

Read Exe Time: 561.0302 ms

Performing reading: 23:4:58.524

Read Exe Time: 561.5756 ms

Performing reading: 23:4:59.524

Read Exe Time: 565.2936 ms

Performing reading: 23:5:0.523

Read Exe Time: 561.8903 ms

Performing reading: 23:5:1.523

Read Exe Time: 561.8768 ms

Performing reading: 23:5:2.523

Read Exe Time: 562.3904 ms

Performing reading: 23:5:3.523

Read Exe Time: 562.3363 ms

Performing reading: 23:5:4.523

Read Exe Time: 561.6288 ms

Performing reading: 23:5:5.523

Read Exe Time: 560.4596 ms

Performing reading: 23:5:6.522

Read Exe Time: 562.34 ms

Performing reading: 23:5:7.522

Read Exe Time: 561.5994 ms

Performing reading: 23:5:8.522

Read Exe Time: 561.6811 ms

Performing reading: 23:5:9.521

Read Exe Time: 561.7427 ms

Performing reading: 23:5:10.521

Read Exe Time: 561.8044 ms

Performing reading: 23:5:11.520

Read Exe Time: 561.6246 ms

Performing reading: 23:5:12.520

Read Exe Time: 560.5753 ms

Performing reading: 23:5:13.520

Read Exe Time: 563.8604 ms

Performing reading: 23:5:14.520

Read Exe Time: 562.2606 ms

Performing reading: 23:5:15.534

Read Exe Time: 560.8377 ms

Performing reading: 23:5:16.534

Read Exe Time: 560.4553 ms

Performing reading: 23:5:17.534

Read Exe Time: 562.5534 ms

Performing reading: 23:5:18.533

Read Exe Time: 563.0269 ms

Performing reading: 23:5:19.532

Read Exe Time: 561.2851 ms

Performing reading: 23:5:20.532

Read Exe Time: 560.3442 ms

Performing reading: 23:5:21.531

Read Exe Time: 561.5201 ms

Performing reading: 23:5:22.530

Read Exe Time: 560.609 ms

Performing reading: 23:5:23.530

编辑:对于@PeterLuu

Performing reading: 22:44:45.13

Performing reading: 22:44:45.449

Performing reading: 22:44:45.879

Performing reading: 22:44:46.320

Performing reading: 22:44:46.761

Performing reading: 22:44:47.192

Performing reading: 22:44:47.631

Performing reading: 22:44:48.74

Performing reading: 22:44:48.577

Performing reading: 22:44:49.49

Performing reading: 22:44:49.637

和代码

private void StartMeter()

{

DateTime now = DateTime.UtcNow;

NextTickTimeWholeSeconds = new DateTime(now.Ticks - (now.Ticks % TimeSpan.TicksPerSecond), now.Kind);

this.Meter.Start();

this.ReadingTime = new Timer(1000);

this.ReadingTime.Elapsed += new ElapsedEventHandler(PerformReading);

this.ReadingTime.Start();

ReadingTime.Interval = GetTimeToNextSecond();

}

private double GetTimeToNextSecond()

{

NextTickTimeWholeSeconds = NextTickTimeWholeSeconds.AddSeconds(1);

var interval = NextTickTimeWholeSeconds - DateTime.UtcNow;

return interval.Milliseconds < 1 ? GetTimeToNextSecond() : interval.Milliseconds;

}

private void PerformReading(object sender, ElapsedEventArgs e)

{

Console.WriteLine("Performing reading: " + DateTime.UtcNow.Hour + ":" + DateTime.UtcNow.Minute + ":" + DateTime.UtcNow.Second + "." + DateTime.UtcNow.Millisecond);

// My code takes about 500-600 ms

ReadingTime.Interval = GetTimeToNextSecond();

}

解决方法:

您可以将时间间隔设置为下一秒(例如,如果距点的下一秒只有890毫秒),然后在每次迭代时以该间隔重新启动计时器,以防止漂移.改编自Jared here的先前答案.这不能提供精确到毫秒的精确度,但可以防止您的时间漂移​​,并且该事件将始终在“点上”触发.

编辑:删除了不必要的行-您实际上不需要调用Start()两次,只需更改间隔就足够了,因为更改间隔会重新启动计时器.

编辑2:进行了一些更改,以使其在极端情况下更加准确(例如,防止连续触发多次).

public class Meter

{

private Timer ReadingTime;

private DateTime NextTickTimeWholeSeconds;

public Meter() {

DateTime now = DateTime.UtcNow;

NextTickTimeWholeSeconds = new DateTime(now.Ticks - (now.Ticks % TimeSpan.TicksPerSecond), now.Kind);

ReadingTime = new Timer();

ReadingTime.AutoReset = false;

ReadingTime.Elapsed += new ElapsedEventHandler(PerformReading);

ReadingTime.Interval = GetTimeToNextSecond();

}

public void StartMeter()

{

ReadingTime.Start();

}

private double GetTimeToNextSecond()

{

NextTickTimeWholeSeconds = NextTickTimeWholeSeconds.AddSeconds(1);

var interval = NextTickTimeWholeSeconds - DateTime.UtcNow;

return interval.Milliseconds < 1 ? GetTimeToNextSecond() : interval.Milliseconds;

}

private void PerformReading(object sender, ElapsedEventArgs e)

{

Console.WriteLine("Performing reading: " + DateTime.Now.Hour + ":" + DateTime.Now.Minute + ":" + DateTime.Now.Second + "." + DateTime.Now.Millisecond);

ReadingTime.Interval = GetTimeToNextSecond();

}

}

示例输出:

Performing reading: 18:11:47.10

Performing reading: 18:11:48.4

Performing reading: 18:11:49.10

Performing reading: 18:11:50.6

Performing reading: 18:11:51.9

Performing reading: 18:11:52.5

Performing reading: 18:11:53.10

Performing reading: 18:11:54.5

Performing reading: 18:11:55.9

Performing reading: 18:11:56.7

Performing reading: 18:11:57.7

Performing reading: 18:11:58.7

Performing reading: 18:11:59.7

Performing reading: 18:12:0.8

Performing reading: 18:12:1.7

Performing reading: 18:12:2.6

... about 50 seconds later ...

Performing reading: 18:12:50.1

Performing reading: 18:12:51.0

Performing reading: 18:12:52.0

Performing reading: 18:12:53.0

Performing reading: 18:12:53.999

Performing reading: 18:12:55.0

Performing reading: 18:12:56.0

Performing reading: 18:12:56.999

Performing reading: 18:12:58.0

Performing reading: 18:12:59.0

Performing reading: 18:13:0.0

Performing reading: 18:13:0.999

Performing reading: 18:13:2.0

Performing reading: 18:13:3.1

Performing reading: 18:13:4.0

Performing reading: 18:13:5.0

Performing reading: 18:13:6.0

Performing reading: 18:13:6.999

Performing reading: 18:13:8.0

Performing reading: 18:13:9.0

Performing reading: 18:13:10.0

Performing reading: 18:13:11.0

Performing reading: 18:13:12.1

Performing reading: 18:13:13.0

Performing reading: 18:13:13.999

Performing reading: 18:13:15.0

Performing reading: 18:13:16.0

Performing reading: 18:13:16.999

Performing reading: 18:13:18.0

Performing reading: 18:13:19.1

Performing reading: 18:13:20.0

Performing reading: 18:13:21.0

Performing reading: 18:13:21.999

Performing reading: 18:13:23.0

Performing reading: 18:13:24.0

Performing reading: 18:13:25.0

Performing reading: 18:13:26.0

Performing reading: 18:13:27.0

Performing reading: 18:13:28.0

Performing reading: 18:13:29.0

标签:timer,c

来源: https://codeday.me/bug/20191120/2044177.html

tick timer 间隔_c#-System.Timers.Timer稳步增加间隔相关推荐

  1. C#学习常用类(1003)---Timer类(System.Timers.Timer)

    Timer类: 在设定的间隔之后生成事件,带有生成重复事件的选项. 若要浏览此类型的 .NET Framework 源代码,请参阅引用源. 命名空间:                   System ...

  2. System.Timers.Timer与System.Threading.Timer

    我最近一直在查看一些可能的计时器,而Threading.Timer和Timers.Timer对我来说是必要的(因为它们支持线程池). 我正在制作游戏,我计划使用不同类型的活动,间隔不同等. 哪个最好? ...

  3. System.Timers.Timer的Enable、Start、Stop记录

    Timer的初始化,此时不执行theout3方法 System.Timers.Timer time = new System.Timers.Timer(); time.Interval = 1000; ...

  4. 使用System.Timers.Timer类实现程序定时执行

    在C#里关于定时器类有3个:System.Windows.Forms.Timer类.System.Threading.Timer类和System.Timers.Timer类. System.Windo ...

  5. C#中System.Timers.Timer定时器的使用和定时自动清理内存的应用

    项目比较大有时候会比较卡,虽然有GC自动清理机制,但是还是有不尽人意的地方.所以尝试在项目启动文件中,手动写了一个定时器,定时清理内存,加快项目运行速度.仅供大家参考吧,代码如下: public cl ...

  6. System.Timers.Timer 多线程问题[转]

    已解决问题] System.Timers.Timer 多线程 ,同时首次进 声明: System.Timers.Timer timer = new System.Timers.Timer(); tim ...

  7. System.Windows.Forms.Timer与System.Timers.Timer的区别

    .NET Framework里面提供了三种Timer: System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer VS ...

  8. C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题

    C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 参考文章: (1)C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 ( ...

  9. System.Timers.Timer 嵌套 System.Windows.Forms.Timer的问题

    如题"System.Timers.Timer 嵌套 System.Windows.Forms.Timer的问题",最近在项目中在类uc_Map中启用了System.Timers.T ...

  10. [C#]System.Timers.Timer

    摘要 在.Net中有几种定时器,最喜欢用的是System.Timers命名空间下的定时器,使用起来比较简单,作为定时任务,有Quartz.net,但有时候,一个非常简单的任务,不想引入这个定时任务框架 ...

最新文章

  1. mysql b-a全局索引_MySQL中B+树索引的使用
  2. MySQL的char与varchar:类型长度 记录字节 截取报错 保存trim 数据校验 存储占用
  3. 相对熵(relative entropy或 Kullback-Leibler divergence,KL距离)的java实现(三)
  4. c++基础(part1)--cpp简介
  5. xampp mysql 查询很慢_如何开启mysql的慢查询机制
  6. hiho1257 Snake Carpet
  7. std::stack
  8. eigrp配置实验_EIGRP的认证的配置
  9. Linux 内存泄漏检查工具 valgrind
  10. docker镜像的使用及相关
  11. 【运动学】基于matlab嫦娥奔月仿真【含Matlab源码 1238期】
  12. 对期货大赛获奖者杨宏斌、陈伟的采访
  13. 如何使用Windows事件查看器和微软知识库解决问题
  14. CCNP 6 ISIS
  15. 终止正在运行的ORACLE作业
  16. Python pandas库|任凭弱水三千,我只取一瓢饮(5)
  17. Mac电脑下载的google chrome无法使用
  18. 贵州计算机教师资格证报名条件,贵州教师资格证报名条件
  19. Java操作Excel并导出
  20. 旋转手机摄像头想法 -Camerax

热门文章

  1. realmex7pro能用鸿蒙系统吗,realmex7pro有nfc吗-realmex7pro支持红外遥控功能吗
  2. 有界、无界队列对ThreadPoolExcutor执行的影响
  3. Oracle递归sql
  4. 如何保证缓存与数据库的双写一致性
  5. Java货币金额转换为大写形式
  6. 人民币对美元汇率中间价报6.7592元 上调23个基点
  7. Silverlight for Windows Phone 7开发系列(1):环境搭建
  8. jQuery知识点学习整理
  9. 业务重点-实现一个简单的手机号码验证
  10. Delphi指针总结