c# - Backgroundworker Sleep 以减少 CPU

标签 c# backgroundworker sleep

我有一个任务要反复执行。我想尽可能快地调用它,但是我想保持较低的 cpu 周期。我读过在 backgroundworker 中使用 Sleep 不是最佳选择。但是,如果不 sleep ,我的 CPU 会保持在 55% 左右。我在下面有一个我的来源的例子。如果 sleep 合适,您如何选择最佳 sleep 时间,正如您从下面的结果中看到的那样,我会根据 sleep 时间长短得出不同的结果。有人可以让我知道做类似事情时的最佳做法是什么吗

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();
}

最佳答案

对于多线程,当您不想消耗机器时,通常会将后台工作设置为较低的优先级。它将使用剩余的任何 CPU。这意味着您不应该关心它是否达到 100%。

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

另一种选择是生成您自己的线程,您可以为其设置优先级。

这是另一个相关的 SO 帖子:

.NET Backgroundworker Object's Thread Priority

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

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

关于c# - Backgroundworker Sleep 以减少 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8283386/

相关文章:

c# - IIS 7.5 和 ASP.NET 凭据

c# - 引入多线程后串口通信出现蓝屏错误

c# - C# 中对文本框的异步写入被覆盖

JavaScript 休眠

javascript - Sleep() 未按预期工作

c# - 判断格式为 "hh:mm"的字符串是否为有效日期

c# - C#中的继承和多态

c# - c# 如何从另一个线程更新datagridview的数据源

c# - 添加时循环列表

c - sleep() 过早地停止了我的程序。我究竟做错了什么?