Точное время в .NET
Вопрос
Я только что видел этот вопрос, где один из ответов указывает на то, что Система.Диагностика.Секундомер следует использовать только для диагностики производительности, а не в рабочем коде.
В таком случае, как лучше всего добиться точного времени в .NET?В настоящее время я нахожусь на ранних стадиях создания очень простого МИДИ секвенсор, использующий функцию MIDI-выхода НАудио.Я хотел бы иметь возможность отправлять MIDI-сообщения с выравниванием (скажем) 1/10 с как можно меньшим джиттером.Возможно ли это, или такие вещи, как переключение контекста, испортят мне день?
В настоящее время у меня есть код в консольном приложении, которое постоянно вызывает Stopwatch
и вычисляет джиттер при генерации потока 1/16 нот со скоростью 150 ударов в минуту.В этой ситуации джиттер очень низкий.Однако я перенесу это в другую тему, поэтому не знаю, останется ли так.
Решение
Если вы не против P/Invoke, вы можете использовать QueryPerformanceCounter: http://www.eggheadcafe.com/articles/20021111.asp
Другие советы
Вы также можете использовать собственный потоковый MIDI API.Я не думаю, что это есть в NAudio, но вы можете посмотреть C# Midi Toolkit, чтобы узнать, поддерживает ли он его.В противном случае у вас есть два примера того, как использовать собственный MIDI API P/Invoke, и вы можете создать свой собственный...
Мультимедийный таймер Windows утверждает, что это позволяет «приложениям планировать события таймера с максимально возможным разрешением (или точностью) для аппаратной платформы».
Приложение, которое он использует в качестве примера, представляет собой MIDI-секвенсор.