我需要一个函数在 +/- 1 毫秒内的精确时间运行。我尝试了以下方法,但最终执行之间的最短时间为 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();
}
使用 Thread.Sleep() 获得相同的结果。
申请概要。
我将读取一个包含 1553 条消息(每条消息都有时间戳)的文件。我将需要以尽可能接近文件包含的时间重播这些消息。消息的时间戳以微秒记录,但我只需要毫秒精度。
这是使用 DDC 1553 卡(PCI 卡)完成的。我有一个分析器,可以让我查看消息,包括消息之间的增量时间,以衡量我的准确性。
我使用的机器有一个带超线程的 QuadCore。使用 for(int i=0; .....) 我可以获得 0.5 毫秒的精度。然而,这是非常低效的,如果可能的话,我们更愿意使用更现实、甚至更便携的方法。
最佳答案
.NET、C#,甚至 Windows 通常都不是适合非常精细计时的实时操作系统。
最糟糕的选择包括使用 Timer
类和 Thread.Sleep()
。
您可以使用 Stopwatch
类相当准确地测量计时,但就准确等待设定的时间量而言,没有内置机制。
如果您可以准确地概述您正在尝试做什么,假设它不是运动控制、硬件接口(interface)等,那么可能有比依赖非常精确的计时器更好的解决方案。
更新; Neal:如果您以对时间敏感的方式与硬件交互,您应该使用不同的解决方案。您可以使用 Stopwatch
进行紧密循环,但只要您这样做,它就会占用大量 CPU。而且它可能不够准确。例如:PIC 芯片、FPGA、I/O 卡或接口(interface),基本上是任何其他东西。
关于c# - 如何以精确的时间运行函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7972645/