tick timer 间隔_c#-System.Timers.Timer稳步增加间隔
我目前正在开发一个对时间敏感的程序,在这一点上重要的一点是,我每秒都要从设备读取一次.
我目前正在为此使用一个计时器,但是我发现时间稳定会增加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稳步增加间隔相关推荐
- C#学习常用类(1003)---Timer类(System.Timers.Timer)
Timer类: 在设定的间隔之后生成事件,带有生成重复事件的选项. 若要浏览此类型的 .NET Framework 源代码,请参阅引用源. 命名空间: System ...
- System.Timers.Timer与System.Threading.Timer
我最近一直在查看一些可能的计时器,而Threading.Timer和Timers.Timer对我来说是必要的(因为它们支持线程池). 我正在制作游戏,我计划使用不同类型的活动,间隔不同等. 哪个最好? ...
- System.Timers.Timer的Enable、Start、Stop记录
Timer的初始化,此时不执行theout3方法 System.Timers.Timer time = new System.Timers.Timer(); time.Interval = 1000; ...
- 使用System.Timers.Timer类实现程序定时执行
在C#里关于定时器类有3个:System.Windows.Forms.Timer类.System.Threading.Timer类和System.Timers.Timer类. System.Windo ...
- C#中System.Timers.Timer定时器的使用和定时自动清理内存的应用
项目比较大有时候会比较卡,虽然有GC自动清理机制,但是还是有不尽人意的地方.所以尝试在项目启动文件中,手动写了一个定时器,定时清理内存,加快项目运行速度.仅供大家参考吧,代码如下: public cl ...
- System.Timers.Timer 多线程问题[转]
已解决问题] System.Timers.Timer 多线程 ,同时首次进 声明: System.Timers.Timer timer = new System.Timers.Timer(); tim ...
- System.Windows.Forms.Timer与System.Timers.Timer的区别
.NET Framework里面提供了三种Timer: System.Windows.Forms.Timer System.Timers.Timer System.Threading.Timer VS ...
- C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题
C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 参考文章: (1)C# System.Timers.Timer中的坑,程序异常退出后timer依然运行问题 ( ...
- System.Timers.Timer 嵌套 System.Windows.Forms.Timer的问题
如题"System.Timers.Timer 嵌套 System.Windows.Forms.Timer的问题",最近在项目中在类uc_Map中启用了System.Timers.T ...
- [C#]System.Timers.Timer
摘要 在.Net中有几种定时器,最喜欢用的是System.Timers命名空间下的定时器,使用起来比较简单,作为定时任务,有Quartz.net,但有时候,一个非常简单的任务,不想引入这个定时任务框架 ...
最新文章
- mysql b-a全局索引_MySQL中B+树索引的使用
- MySQL的char与varchar:类型长度 记录字节 截取报错 保存trim 数据校验 存储占用
- 相对熵(relative entropy或 Kullback-Leibler divergence,KL距离)的java实现(三)
- c++基础(part1)--cpp简介
- xampp mysql 查询很慢_如何开启mysql的慢查询机制
- hiho1257 Snake Carpet
- std::stack
- eigrp配置实验_EIGRP的认证的配置
- Linux 内存泄漏检查工具 valgrind
- docker镜像的使用及相关
- 【运动学】基于matlab嫦娥奔月仿真【含Matlab源码 1238期】
- 对期货大赛获奖者杨宏斌、陈伟的采访
- 如何使用Windows事件查看器和微软知识库解决问题
- CCNP 6 ISIS
- 终止正在运行的ORACLE作业
- Python pandas库|任凭弱水三千,我只取一瓢饮(5)
- Mac电脑下载的google chrome无法使用
- 贵州计算机教师资格证报名条件,贵州教师资格证报名条件
- Java操作Excel并导出
- 旋转手机摄像头想法 -Camerax