c# - 如何以精确的时间运行函数?

标签 c# .net multithreading performance timer

我需要一个函数在 +/- 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/

相关文章:

c# - 将额外参数传递给 EventHandler

c# - EF 核心 - 为没有连接字符串和另一个类库中的数据库创建迁移

c# - ASP.NET Web 服务结果、代理类和类型转换

c# - 带有oauth的webapi,撤销 token ?

c++ - std::atomic 在一个简单的 POD 类上

c# - 从 WinForms GUI 线程调用 COM 线程上的方法时出现问题?

c# - blittable 类型上的非 blittable 错误

c# - CLR内部调用用什么语言编写?

c# - 如何终止在 C# 中的 foreach 循环中启动的线程

c - 段错误 C : malloc(sizeof(char*)*3)