c# - 多线程文件搜索 C#

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

现在我正在尝试实现并行搜索以加快搜索速度。我尝试了几个程序来让它工作。尝试使用 backgroundworker 和线程,但遇到问题并且很难调试以了解问题出在哪里?有人可以让我知道实现并行搜索的方法吗?这一步我会自己去弄清楚。我们将不胜感激提供的任何帮助。

最佳答案

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

其次,您可以通过调用 Directory.EnumerateFiles 来简化您的代码.如果您想同时搜索多个驱动器,只需启动多个 BackgroundWorker 实例,每个实例都使用 EnumerateFiles 来搜索不同的驱动器。

但是请注意,如果 EnumerateFiles 遇到目录权限问题,它会抛出异常(您的代码也是如此),这在搜索整个驱动​​器时并不少见。如果这是一个问题(很可能会是),那么您必须编写自己的目录搜索器。其中之一是对 this question 的回答。 .

关于c# - 多线程文件搜索 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6230029/

相关文章:

c# - HashSet 未调用重写的 Equals 方法

C# + iTunes COM : iTunes event sometimes gets raised, 通常不会

c# - 如何引用另一个程序集文件并从中调用

java - 使用监视器输入 : How should i call synchronised method?

java - 当线程 A 中断线程 B 时,如何识别线程 A 的名称或任何上下文信息?

c# - 选择一个*启发式函数

c# - LINQ、联接、分组和聚合

java - 如何等待ExecutorService完成而不关闭?

ios - 主线程上的 NSOperationQueue 回调仍然没有正确更新 UI

c++ - 通过 Python 控制台对 PythonQt 库进行非锁定调用