我刚看到this question,其中一个答案表明System.Diagnostics.Stopwatch只应用于诊断效果,而不能用于生产代码。
在这种情况下,在.NET中获得精确计时的最佳方法是什么?我目前正处于使用MIDI的MIDI输出功能构建一个非常简单的NAudio音序器的早期阶段。我希望能够以尽可能小的抖动将MIDI消息发送到(例如)1 / 10s。这是可行的,还是像上下文切换这样的事情会破坏我的一天?
我目前在控制台应用程序中有一些代码,它连续调用Stopwatch
并在150bpm生成1/16笔记流时计算抖动。在这种情况下抖动非常低。但是,我将把它移到另一个线程,所以我不知道是否仍然如此。
答案 0 :(得分:6)
如果您不介意P / Invoke,可以使用QueryPerformanceCounter:http://www.eggheadcafe.com/articles/20021111.asp
答案 1 :(得分:1)
您还可以使用本机流式MIDI API。我不认为它在NAudio,但你可以看看C#Midi工具包,看看是否支持它。否则你有两个如何进行原生MIDI API P / Invoke的例子,可以自己滚动...
答案 2 :(得分:0)
Windows multimedia timer表示它允许"应用程序以最高分辨率(或准确度)为硬件平台安排定时器事件。"
它用作示例的应用程序是MIDI音序器。
答案 3 :(得分:0)
我是DryWetMIDI的作者。该库具有回放功能,可借助WinMM高精度计时器来工作。计时器被包装到MidiClock类中,因此您可以使用它来驱动MIDI操作:
Cognito
var midiClock = new MidiClock(true, new HighPrecisionTickGenerator(), TimeSpan.FromMilliseconds(1));
midiClock.Ticked += OnTick;
将每1毫秒被调用一次。