多线程文件搜索C#

abd*_*s85 2 c# multithreading

我需要一些帮助.现在我已经完成了一个文件搜索,它将搜索我的整个硬盘驱动器并且可以正常工作.以下是执行此操作的两种方法.

public void SearchFileRecursiveNonMultithreaded()
    {
        //Search files multiple drive

        string[] drives = Environment.GetLogicalDrives();

        foreach (string drive in drives)
        {
            if (GetDriveType(drive).ToString().CompareTo("DRIVE_FIXED") == 0)
            {
                DriveInfo driveInfo = new DriveInfo(drive);

                if (driveInfo.IsReady)
                {
                    System.IO.DirectoryInfo rootDirectory = driveInfo.RootDirectory;
                    RecursiveFileSearch(rootDirectory);
                }
            }
        }
        MessageBox.Show(files.Count.ToString());
    }

    public void RecursiveFileSearch(DirectoryInfo root)
    {
        DirectoryInfo[] subDirectory;
        try
        {
        //private List<FileInfo> files = new List<FileInfo>() is declared above
            files.AddRange(root.GetFiles(searchString.Text, SearchOption.TopDirectoryOnly));
        }
        catch (Exception)
        {
        }

        try
        {
            // Now find all the subdirectories under this directory.
            subDirectory = root.GetDirectories();

            foreach (System.IO.DirectoryInfo dirInfo in subDirectory)
            {
                // Resursive call will be performed for each subdirectory.
                RecursiveFileSearch(dirInfo);
            }
        }
        catch (Exception e)
        {
            MessageBox.Show(e.ToString());
        }
    }
Run Code Online (Sandbox Code Playgroud)

现在我正在尝试实现并行搜索以加快搜索速度.我尝试了几个程序来实现这一点.试图使用backgroundworker以及线程,但有问题,调试很难知道什么是错的?有人能让我知道实现并行搜索的方法.这个步骤我会自己去弄清楚.任何提供的帮助都将大大减少.

Jim*_*hel 5

首先,正如其他人所指出的那样,当您只搜索一个驱动器时,使用多个线程不太可能加快速度.您的绝大部分时间都花在等待磁盘头移动到需要的位置,并且它一次只能在一个地方.在这里使用多个线程是浪费精力,并且很可能实际上使程序变慢.

其次,只需调用Directory.EnumerateFiles即可简化代码.如果要同时搜索多个驱动器,只需启动多个BackgroundWorker实例,每个实例EnumerateFiles用于搜索不同的驱动器.

但是,请注意,EnumerateFiles如果它跨目录权限问题运行会抛出异常(代码也会如此),这在搜索整个驱动​​器时并不常见.如果这是一个问题(可能会是),那么你必须编写自己的目录搜索器.其中一个就是这个问题的答案.