c# – 最精确的Thread睡眠方法:Monitor.Wait vs System.Timer v
发布时间:2020-12-16 00:03:44 所属栏目:百科 来源:网络整理
导读:什么.NET对象(或技术)在每XXX毫秒启动一个线程时最精确?有什么权衡? 例如: int maxDurationMs = 1000; while (true) { DateTime dt = DateTime.UtcNow; DoQuickStuff() TimeSpan duration1 = DateTime.UtcNow - dt; int sleepTime = maxDurationMs - dura
什么.NET对象(或技术)在每XXX毫秒启动一个线程时最精确?有什么权衡?
例如: int maxDurationMs = 1000; while (true) { DateTime dt = DateTime.UtcNow; DoQuickStuff() TimeSpan duration1 = DateTime.UtcNow - dt; int sleepTime = maxDurationMs - duration1.Milliseconds; if (sleepTime > 0) System.Threading.Thread.Sleep(sleepTime); } 要么 // CPU Intensive,but fairly accurate int maxDurationMs = 1000; while (true) { DateTime dt = DateTime.UtcNow; DoQuickStuff() while (true) { if (dt.AddMilliseconds(maxDurationMs) >= DateTime.UtcNow) break; } } 做同样事情的替代方法,但具有不同程度的准确性和权衡(CPU等) > System.Timer 解决方法
我自己从未实际使用它们,但据说
Multimedia Timers具有Windows中任何计时器服务的最佳分辨率. .NET BCL没有此计时器服务的包装器,因此您必须自己进行P / Invoke调用.
另一种选择可能是在紧密循环中使用秒表和一些标准的Thread.Sleep调用.我不确定这种方法会带来多少运气,但它可能比普通的Thread.Sleep调用更准确.我从未尝试过,但我认为任何事都值得一试. 我做了一些实验,我发现将线程优先级更改为ThreadPriority.Highest有很大的不同.它在我尝试的每种技术上都相当减少了间隔的标准偏差. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |