使用递归线程的目录搜索仅在没有线程的情况下工作

时间:2015-01-28 18:07:33

标签: c# multithreading recursion

我尝试使用线程构建递归目录搜索,但不知何故它不起作用,如果我尝试使用线程,它确实有效,我不明白为什么。在网上搜索了servel的地方,但是如果你看到/ * * /里面的方法是什么,那么没有找不到解决我问题的方法。

class Program
{
    private static List<string> files = new List<string>();
    public static bool FolderContainName(DirectoryInfo source, string name)
    {
        FileInfo[] files = source.GetFiles(name);
        return (files.Length <= 0);
    }

    public static void FileLocataion(DirectoryInfo source, string sFileName)
    {
        if (!FolderContainName(source,sFileName))
        {
            files.Add(source.ToString());
        }
        DirectoryInfo [] newSource = source.GetDirectories();
        if (newSource.Length>0)
        {
            for(int i = 0 ; i < newSource.Length; i++)
            {
                Thread a = new Thread(() => FileLocataion(newSource[i],sFileName));
                a.Start();
            }
        }

        /*if (!FolderContainName(source, sFileName))
        {
            files.Add(source.ToString());
        }
        DirectoryInfo[] newSource = source.GetDirectories();
        if (newSource.Length > 0)
        {
            for (int i = 0; i < newSource.Length; i++)
            {
                FileLocataion(newSource[i], sFileName);
            }
        }*/

    }

    static void Main(string[] args)
    {
        Console.WriteLine("Enter locataion:");
        DirectoryInfo source = new DirectoryInfo(Console.ReadLine());
        Console.WriteLine("Enter file name:");
        string fileName = Console.ReadLine();
        files.Clear();
        FileLocataion(source, fileName);
        for (int i = 0; i < files.Count;i++ )
            Console.WriteLine(files[i]);
    }
}

1 个答案:

答案 0 :(得分:2)

首先,每个线程都试图将内容添加到List,这不是线程安全的。例如,使用System.Collections.Concurrent

中的对象

其次,FileLocation几乎会立即返回,并且您试图在构造之前读取结果。看看Taskasync/await,这将有助于您处理。

This article是一个好的开始。

哦,顺便说一句,C#中已经内置了用于递归列出目录的功能:

var myFiles = Directory.GetFiles(extractPath, "*.*", SearchOption.AllDirectories);