アプリ置き場

アプリ置き場

http://www.moreread.net/

C# お手軽にそこそこ高精度なSleep

.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以降、この関数はグローバル タイマー解決に影響しなくなりました。