.NET Framework4.8、2023年10月時点で最新状態のWindows11で確認
通常
Task.Delay(1) 15msくらいの精度
Thread.Sleep(1) 15ms くらいの精度
timeBeginPeriod(1)を実行してから
[DllImport("Winmm.dll")] public static extern uint timeBeginPeriod(uint uuPeriod);
Task.Delay(1) 15msくらいの精度
Thread.Sleep(1) 1~2msくらいの精度
合わせ技
Thread.Sleepでメインループを回すとスレッドをブロックしてイベント受信が滞るので合わせ技
static hoge{ timeBeginPeriod(1); } async Task Delay(int delay) { await Task.Run(() => System.Threading.Thread.Sleep(delay)); }
タスクスイッチを促しつつ最小2ms程度で返ってくる
補足
ちなみに以前のtimeBeginPeriodは他のアプリへの影響があったが、
いつからかプロセス内に閉じることになったらしいので気にせず使用できる
バージョン 2004 Windows 10以降、この関数はグローバル タイマー解決に影響しなくなりました。