我的程序需要尽可能快地不断执行许多重复计算。有许多任务并行运行,导致 CPU 利用率为 100%。为了让用户减缓处理过载(略低于 100% 的 CPU,取决于硬件),我添加了
await Task.Delay(TimeSpan.FromMilliseconds(doubleProcessingCycleIntervalMilliseconds));
以重加工方式。只要 doubleProcessingCycleIntervalMilliseconds 的值至少为 1 毫秒,这就可以完美运行。 对于拥有高端计算机的用户(计算速度将少于一毫秒),我想添加相同的延迟选项,而不是使用滴答的毫秒数。所以现在代码看起来:
if (ProcessingCycleIntervalOptionsMilliseconds == true)
{
await Task.Delay(TimeSpan.FromMilliseconds(doubleProcessingCycleIntervalMilliseconds));
}
else
{
await Task.Delay(TimeSpan.FromTicks(longProcessingCycleIntervalTicks));
}
当 longProcessingCycleIntervalTicks 的值至少为 10000 ticks(=1ms)时,程序运行完美。不幸的是,当值低于 1 毫秒(我可以理解的 doubleProcessingCycleIntervalMilliseconds 为 0)或低于 10000(即 longProcessingCycleIntervalTicks 为 9999)时,程序变得没有响应。所以从字面上看,1 毫秒以下 1 个刻度的差异会挂起程序。我不使用 MVVM。 (以防万一:我在开发计算机上检查了 Stopwatch.IsHighResolution 为真)
是否可以/正确使用
await Task.Delay(TimeSpan.FromTicks(longProcessingCycleIntervalTicks));
在 .NET 4.5.1 中?如果是,那么如何确定用户何时可以使用它?
最佳答案
您的目的不是要将 CPU 利用率保持在 100% 以下。您的意图是保持系统响应。限制 CPU 利用率是一个错误的目标。
执行此操作的方法是使用低优先级线程。 Use a custom task scheduler for your CPU bound tasks.
Windows 中的计时准确性有限。 Thread.Sleep
无法使用小数毫秒。 .NET 在移交给 Sleep
之前将它们四舍五入.
关于c# - 使用 TimeSpan.FromTicks 延迟任务是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21811915/