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/