有没有办法在C#中以高分辨率频率执行方法,例如:每100微秒?
不同频率的两种不同方法怎么样,例如方法1每0.1毫秒,方法2 0.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
类的方法。
另外,当我以不同的频率执行这两种方法时,是否需要注意一些线程问题?
谢谢!
答案 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的分辨率。硬件是否能够做到这一点取决于年龄。
所以,抱歉,这是你能得到的最好的。