c# - 使用 TimeSpan.FromTicks 延迟任务是否正确?

标签 c# task delay timespan

我的程序需要尽可能快地不断执行许多重复计算。有许多任务并行运行,导致 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/

相关文章:

c# - WPF检查系统上是否安装了python

c# - 终止/中止/停止使用 Task.Factory.StartNew() 创建的任务

c - 使用 OpenMP-Tasks 的生产者-消费者

html - CSS3 动画延迟问题

c# - MySQL BLOB 图像数据逐渐丢失?

c# - 如何在 IDesignTimeServices 中正确使用 IPluralizer

c# - 如何以编程方式将视频通话设置为全屏启动? (Lync SDK)

c# - 异步方法中的 Task.WhenAll,然后展开每个任务

JavaScript - for 循环内的 setTimeout 函数导致代码在 for 循环完成之前执行

javascript - 如何用延迟停止循环计时器 jQuery