2011-11-27 95 views
5

我有一个任务,我想反复运行。我想尽可能快地调用它,但是我想保持低CPU周期。我已经阅读了在背景工作中使用睡眠不是最好的选择。然而,如果没有睡眠,我的CPU会保持55%左右。我有一个我的源代码示例如下。如果睡眠是适当的,你如何选择最佳睡眠时间,正如你从下面的结果中可以看到的,我根据我睡了多长时间得到不同的结果。有人可以让我知道什么最好的做法做类似Backgroundworker睡眠减少CPU

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

根据您如何使用它,可能是一个Timer更合适。 –

+0

我想过计时器,但我的任务需要5秒到5分钟才能完成,所以我认为背景工作者会是更好的选择。 – poco

+2

你为什么关心CPU%?如果你想确保系统的其他部分保持响应,也许把它放在优先级较低的线程上会更合适。 –

回答

1

采用多线程的东西时,这是常见的后台工作设定为较低的优先级,当你不想要消费机器。它将使用任何剩余的CPU。这意味着你不应该在乎它是否达到100%。

但是,BackgroundWorker的问题是您无法设置优先级。

另一个选项是产生自己的线程,您可以设置优先级。

这里还有一个相关的SO职位:

.NET Backgroundworker Object's Thread Priority

此外,另一个(可能不太吸引)的选择是把繁重的工作到另一个进程,使该运行低优先级。如果你不需要沟通很多进展,那很简单。否则,打开通信通道会更加复杂。

How do I launch a process with low priority? C#

0

给你的后台线程优先级较低将确保您处理不与其他功能干扰(只要给它足够低的优先级)。但是,这是你的解决方案吗?你想要后台工作连续运行。也许缓慢运行对你来说不是一个好的选择?

这是什么你真的试图实现?

1

确定性睡眠不是您在大多数情况下可以实现的最佳优化(它只是您的案例中的一个随机数,而不是您可以拥有的完美优化),rather wait and signal是最佳选择。您现在可以尝试降低线程优先级,但我强烈建议您获得最佳性能使用等待和信号范例