我之前遇到过调用 System.Threading.Thread.Sleep(0); 的建议。在 C# 中的紧身衣循环中以防止 CPU 占用并使用它来获得良好的效果。
我有一个 PowerShell 脚本,它有一个紧密的循环,我想知道我是否应该调用 [Thread]::Sleep(0) 或 Start-Sleep 0 或者 PS 引擎是否偶尔会为我屈服。
我之前遇到过调用 System.Threading.Thread.Sleep(0); 的建议。在 C# 中的紧身衣循环中以防止 CPU 占用并使用它来获得良好的效果。
我有一个 PowerShell 脚本,它有一个紧密的循环,我想知道我是否应该调用 [Thread]::Sleep(0) 或 Start-Sleep 0 或者 PS 引擎是否偶尔会为我屈服。
当您只是确保它不会接管处理器时,我发现通过 .Sleep() 或其他方式显式产生线程存在一些问题。第一个是它只会让你的代码看起来很糟糕,因为它洒满了 Thread.Sleep(0)。您可以评论每个实例,但看起来不太好。
下一个问题是您只能生成您控制的代码。如果长时间运行的脚本的一部分调用了您无法控制的长时间运行的函数,这根本没有帮助。
相反,我会在长时间运行的操作期间将 ThreadPriority 更改为低于正常或最低。这将解决这两个问题,并且可能会更有效,因为操作系统现在可以做出更明智的决定,决定何时将您退出。
[Thread]::CurrentThread.ThreadPriority = System.Threading.ThreadPriority.Lowest
我建议使用 Thread.SpinWait(20)。它在英特尔 HT 盒子上运行良好。高级方法是检查 CPU 的数量并调用 Sleep(0) 用于单个 CPU 或 SpitWait(20) 否则