【问题标题】:BackgroundWorker and CPU usage issues?BackgroundWorker 和 CPU 使用问题?
【发布时间】:2014-06-27 12:36:01
【问题描述】:

我想遍历我计算机中的所有文件并将文件名保存到文本文件中。为了避免 UI 阻塞,我在后台工作人员中使用它。下面的代码工作正常。但是,CPU使用率太高了。有时会超过 60%

  private void filelistmanagementWorker_DoWork(object sender, DoWorkEventArgs e)
{        
    DriveInfo[] allDrives = DriveInfo.GetDrives();
    List<string> directoryList = new List<string>();

    foreach (DriveInfo d in allDrives)
    {
        if (d.IsReady)
        {
            ApplyAllFiles(d.Name, ProcessFile);
        }
    }

    // iterate over all personal folders
    foreach (Environment.SpecialFolder s in  Enum.GetValues(typeof(Environment.SpecialFolder)))
    {
        string pth = Environment.GetFolderPath(s);
        ApplyAllFiles(pth, ProcessFile);
    }
}

private void ApplyAllFiles(string folder, Action<string> fileAction)
{
    try
    {
        foreach (string file in Directory.GetFiles(folder))
        {
            fileAction(file);
        }
        foreach (string subDir in Directory.GetDirectories(folder))
        {
            try
            {
                ApplyAllFiles(subDir, fileAction);
            }
            catch
            {
                // swallow, log, whatever
            }
        }
    }
    catch (Exception E) {  }
}

private void ProcessFile(string path)
{    
    //MessageBox.Show("1");
    // logic       
    path = path.Replace(":","");
    path = path.Replace("\\", "/");
    // MessageBox.Show(path.Replace("\\", "/"));
    if (!path.Contains("Recycle"))
    {
        try
        {               
           File.AppendAllText("allFilesList.txt", path + "@!@");
        }
        catch (Exception Ed) { 
        //    MessageBox.Show(Ed.Message); 
        }
    }
}

问题:如何降低cpu使用率。目前超过 60%

【问题讨论】:

  • 尽量不要在 ApplyAllFiles 中递归地抛出/捕获异常
  • 我认为你做不到。无论如何,不​​在算法本身的范围内。您可以降低正在运行的进程的优先级,并且可能有办法以编程方式执行此操作,但除此之外,操作系统将决定为正在运行的进程提供多少 CPU。
  • 为什么要降低CPU使用率?这应该不是问题,除非它长时间卡在(或接近)100%,在这种情况下性能会下降。
  • @XN16 实际上我在我的计算机上看不到任何问题,但是如果该文件在配置较低的计算机(例如 Pentium III 1 Ghz 处理器)中运行怎么办。你确定这不会是个问题吗?
  • @ShikataGaNai 您很可能会在使用较低规格的计算机时遇到问题,但在这种情况下,唯一的选择是降低进程优先级(如@JoaoMendes 建议的那样),但这更多是操作系统级别的考虑,不是应用程序级别,或者使用更强大的机器。也许在您的 ApplyAllFiles 方法中添加 Thread.Sleep() 调用会减慢它的速度,从而降低 CPU 使用率,但这只是一个猜测!

标签: c# performance backgroundworker cpu-usage


【解决方案1】:

您的后台进程使用 100% 的 CPU 并没有什么问题,只要它不阻塞其他需要它的东西。

例如在 Windows 中,当进程使用 100% CPU 并且您按 Ctrl+Alt+Delete 时,这显然应该优先。如果它(几乎)立即显示锁定屏幕,则没有问题。

如果在您的流程完成之前它没有做任何事情,那么您有一个大问题,那就是您需要调查的时候。否则别担心!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多