4
  1. 有没有办法在 C# 中以高分辨率频率执行方法,例如每 100 微秒?

  2. 那么两种不同频率的不同方法呢,例如 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类的方法。

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

谢谢!

4

3 回答 3

3

它很难看,但您可能有机会使用秒表 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 毫秒的时间内运行。

于 2012-12-20T09:59:10.070 回答
2

这是不可能的。Windows 不是实时操作系统。

于 2012-12-20T05:06:56.200 回答
-2

不可能。您低于 MS 开发人员认为合理的水平。

假设现代硬件,你能做的最好的事情是 TImerQueue、HPET。可以在bios中禁用,因此可能需要进行调整。

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686796(v=vs.85).aspx

没有可用的 .NET API,但通过 Interop 进行映射很简单。

那说:那里的时间参数有一个int周期,以毫秒为单位,所以我们只讨论1ms的分辨率。硬件是否能做到这一点主要取决于年龄。

所以,对不起,这是你能得到的最好的。

于 2012-12-20T05:30:33.457 回答