我有一项任务,我想反复运行。我想尽可能快地调用它,但是我想保持我的cpu周期较低。我在后台工作中使用Sleep阅读并不是最佳选择。然而,没有睡眠,我的CPU保持在55%左右。我在下面有一个我的源代码示例。如果睡眠合适,你如何选择最佳睡眠时间,正如你从下面的结果中看到的那样,根据我的睡眠时间长短得到不同的结果。做某事的人可以让我知道最佳做法是什么
BackgroundWorker _Worker = new BackgroundWorker()
{
WorkerReportsProgress = true,
WorkerSupportsCancellation = true
};
void Worker_DoWork(object sender, DoWorkEventArgs e)
{
// do my task here
// if i uncomment one of the Sleep below I reduce the CPU like so
// no sleep CPU = 52-58%
// Thread.Sleep(1); CPU = 09-15%
// Thread.Sleep(10); CPU = 02-03%
// Thread.Sleep(100); CPU = 00-01%
}
void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (e.Cancelled) { return; }
_Worker.RunWorkerAsync();
}
答案 0 :(得分:1)
对于多线程,当您不想使用机器时,通常会将后台工作设置为较低的优先级。它将使用剩余的CPU。这意味着你不应该关心它是否达到100%。
但是,BackgroundWorker的问题是您无法设置优先级。
另一个选择是产生你自己的线程,你可以设置优先级。
这是另一篇相关的SO帖子:
.NET Backgroundworker Object's Thread Priority
另外,另一个(可能吸引力较小)选项是将繁重的工作放入另一个进程并使该优先级低的运行。如果您不需要传达很多进展,那很简单。否则,打开通信渠道会更复杂。
答案 1 :(得分:1)
在大多数情况下,确定性睡眠不是最佳优化(在您的情况下它只是一个随机数,而不是您可以进行的完美优化),rather wait and signal是最佳选择。您现在可以尝试降低线程优先级,但我强烈建议使用等待和信号范例获得最佳性能
答案 2 :(得分:0)
将后台线程设置为较低优先级将确保您的处理不会干扰其他功能(只需给予它足够低的优先级)。但是,这是一个解决方案吗?您希望后台工作持续运行。也许慢慢跑对你来说不是一个好选择?
你真的想要实现什么?