10

我刚刚看到这个问题,其中一个答案表明System.Diagnostics.Stopwatch应该只用于诊断性能,而不是用于生产代码。

在这种情况下,在 .NET 中获得精确计时的最佳方法是什么?我目前正处于使用NAudio的 MIDI 输出功能构建一个非常简单的MIDI 音序器的早期阶段。我希望能够以尽可能少的抖动将 MIDI 消息发送到(比如说)1/10 秒。这是可行的,还是像上下文切换这样的事情会毁了我的一天?

我目前在控制台应用程序中有一些代码,它Stopwatch在以 150bpm 生成 1/16 音符流时不断调用和计算抖动。在这种情况下,抖动非常低。但是,我将把它移到另一个线程,所以我不知道这种情况是否会继续存在。

4

4 回答 4

5

如果不介意P/Invoke,可以使用QueryPerformanceCounter:http ://www.eggheadcafe.com/articles/20021111.asp

于 2009-04-27T22:13:34.230 回答
1

你也可以使用原生的流媒体 MIDI API。我不认为它在 NAudio 中,但您可以查看 C# Midi Toolkit 以查看它是否支持它。否则,您有两个示例说明如何执行本机 MIDI API P/Invoke,并且可以自己滚动...

于 2010-03-08T14:10:37.443 回答
0

Windows 多媒体计时器声明它允许“应用程序以硬件平台可能的最大分辨率(或精度)来安排计时器事件”。

它用作示例的应用程序是 MIDI 音序器。

于 2015-06-17T21:59:30.600 回答
0

我是DryWetMIDI的作者。该库具有播放功能,可在 WinMM 高精度计时器的帮助下工作。Timer 被封装到MidiClock类中,因此您可以使用它来驱动您的 MIDI 操作:

var midiClock = new MidiClock(true, new HighPrecisionTickGenerator(), TimeSpan.FromMilliseconds(1));
midiClock.Ticked += OnTick;

OnTick将使用此代码每 1 毫秒调用一次。

于 2020-08-21T13:43:25.227 回答