• 有没有办法在 C# 中以高分辨率频率执行方法,例如每 100 微秒?
  • 不同频率的两种不同方法怎么样,例如Method1 每 0.1 ms 和 Method2 0.3 ms?

  • MSDN 有关于将事件处理程序附加到 Systems.Timers.Timer 类的文档,如下所示:
    public static void Main()
    {
    
        System.Timers.Timer aTimer = new System.Timers.Timer();
        aTimer.Elapsed += new ElapsedEventHandler(Method);
        aTimer.Interval = 2000;
        aTimer.Enabled = true;
        GC.KeepAlive(aTimer);
    }
    

    但是当我对其进行基准测试时,System.Timers.Timer 只有 15~16 毫秒的精度。我的 CPU 的性能计数器的精度为 0.1 毫秒及以下,但我找不到将事件处理程序附加到 Stopwatch 类的方法。

    另外,当我以不同的频率执行这两种方法时,是否有一些线程问题需要注意?

    谢谢!

    最佳答案

    它很难看,但您可能有机会使用秒表 ElapsedTicks。

    Stopwatch w = new Stopwatch()
    long nextTick = 0;
    long ticksPerMicroSecond = 1000000L / Stopwatch.Frequency; // Number of ticks per microsec.
    long periodInTicks = ticksPerMicroSecond / 100; // Ticks per 0.1ms
    
    while(true)
    {
      long currentTick = w.ElapsedTicks.
      if (currentTick  > nextTick)
      {
        nextTick = currentTick + periodInTicks;
        // Do something here.
      }
    }
    

    它尽可能丑陋,并且您会得到一个 while(true) 循环,它可能会免费使用 100% cpu(然后最好在多核上运行它)。

    您可能想要对事物进行一些基准测试(查看 Stopwatch.Frequency msdn doc 中的示例),以了解您的计时器的精确度,以及您的内部功能因迟到而导致的漂移。您可能还想启用后台 gc 以避免 GC 阻塞您的线程。虽然这表明它在代码中是可行的,但我真的不确定您是否可以在不到 0.1 毫秒的时间内运行您的函数。

    关于c# - 每 0.1 ms 和 0.3 ms 重复两个任务(Systems.Timer.Timer 不够精确),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13965470/

    10-12 23:03