每0.1毫秒和0.3毫秒重复两个任务(Systems.Timer.Timer不够精确)

时间:2012-12-20 04:44:57

标签: c# .net timer

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

  2. 不同频率的两种不同方法怎么样,例如方法1每0.1毫秒,方法2 0.3毫秒?

  3. 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 ms的精度。我的CPU性能计数器精度为0.1毫秒及以下,但我找不到将事件处理程序附加到Stopwatch类的方法。

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

    谢谢!

3 个答案:

答案 0 :(得分: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.
  }
}

它就像它可以获得的那样丑陋,并且你得到一段时间(真实的)循环,这可能是免费使用100%cpu(然后在多核上更好地运行它)。

您可能希望稍微对该事物进行基准测试(请参阅Stopwatch.Frequency msdn doc中的示例),以了解您的计时器的精确程度,并查看因内部函数迟到而产生的偏差。您可能还希望启用后台gc以避免GC阻塞您的线程。虽然这表明它在代码中是可行的,但我真的不确定你能在不到0.1ms的时间内运行你的功能。

答案 1 :(得分:2)

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

答案 2 :(得分:-2)

不可能。你低于MS开发者认为合理的。

最好的你可以做 - 现代硬件 - 是TImerQueue,HPET。可以在BIOS中禁用,因此可能需要进行调整。

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

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

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

所以,抱歉,这是你能得到的最好的。