如何运行精确计时的功能?

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毫秒的准确度.然而,这是非常低效的,并且如果可能的话,更愿意使用更现实且更便携的方法.

Kie*_*one 5

.NET,C#甚至Windows通常都不是适合非常精细计时的实时操作系统.

最糟糕的选择包括使用Timer类和Thread.Sleep().

您可以使用Stopwatch该类相当准确地测量时序,但是在准确等待一定时间内通过时......没有内置机制.

如果你可以准确地概述你想要做什么,假设它不是运动控制,硬件接口等,那么可能有一个比依赖非常精确的定时器更好的解决方案.

更新; Neal:如果您以时序敏感的方式与硬件接口,则应使用不同的解决方案.你可以用一个紧凑的循环Stopwatch,但只要你这么做就会使用大量的CPU.它可能不够准确.例如:PIC芯片,FPGA,I/O卡或接口,基本上是其他任何东西.