Nea*_*eal 2 .net c# performance multithreading timer
我需要一个函数在+/- 1ms内的精确时间运行.我尝试过以下操作但最终执行时间最短为15毫秒.
void Main()
{
System.Timers.Timer timer = new System.Timers.Timer(1); // executes every 15ms
timer.Elapsed += new System.Timers.ElapsedEventHandler(myFunction);
System.Timers.Timer timer2 = new System.Timers.Timer(5); // executes every 15ms
timer2.Elapsed += new System.Timers.ElapsedEventHandler(myFunction);
System.Timers.Timer timer2 = new System.Timers.Timer(20); // executes every 31ms
timer3.Elapsed += new System.Timers.ElapsedEventHandler(myFunction);
timer.Start();
timer2.Start();
timer3.Start();
}
void myFunction()
{
doWord();
}
Run Code Online (Sandbox Code Playgroud)
使用Thread.Sleep()获得相同的结果.
申请概要.
我将在一个包含1553条消息的文件中读取(每条消息都有一个时间戳).我需要尽可能接近文件所包含的时间重播这些消息.消息的时间戳记录在microsec中,但我只需要msec准确度.
这是使用DDC 1553卡(PCI卡)完成的.我有一个分析器,它允许我查看消息,包括消息之间的增量时间,以测量我的准确性.
我正在使用的机器有一个具有超线程的QuadCore.使用for(int i = 0; .....)我可以获得0.5毫秒的准确度.然而,这是非常低效的,并且如果可能的话,更愿意使用更现实且更便携的方法.
.NET,C#甚至Windows通常都不是适合非常精细计时的实时操作系统.
最糟糕的选择包括使用Timer类和Thread.Sleep().
您可以使用Stopwatch该类相当准确地测量时序,但是在准确等待一定时间内通过时......没有内置机制.
如果你可以准确地概述你想要做什么,假设它不是运动控制,硬件接口等,那么可能有一个比依赖非常精确的定时器更好的解决方案.
更新; Neal:如果您以时序敏感的方式与硬件接口,则应使用不同的解决方案.你可以用一个紧凑的循环Stopwatch,但只要你这么做就会使用大量的CPU.它可能不够准确.例如:PIC芯片,FPGA,I/O卡或接口,基本上是其他任何东西.