2012-06-30 29 views
0

我有一个递归通过目录,并建立一个树的方法:获取目录与并行的ForEach

public void RecurseFolders(TreeNode mainNode) { 
    DirectoryInfo nodeDir = new DirectoryInfo(mainNode.Tag.ToString()); 
    try { 
    foreach (var dir in nodeDir.GetDirectories()) { 
     int index = GetSystemIcon(dir.FullName, treeView1.ImageList, false); 
     var subNode = new TreeNode(dir.Name, index, index); 
     subNode.Tag = dir.FullName; 
     mainNode.Nodes.Add(subNode); 
     RecurseFolders(subNode); 
    } 
    } catch (UnauthorizedAccessException err) { 
    Console.WriteLine(err); 
    } 
} 

我想如何处理此做的是找到一种方法来写一个Parallel.ForEach出来的它,但我的LINQ知识太处女了。

显然,我不能将TreeNode传入线程,所以我修改了签名以使其更通用。这是我得到的:

public string[] RecurseFolders(string dirString) { 
    List<string> list = new List<string>(); 
    DirectoryInfo nodeDir = new DirectoryInfo(dirString); 
    Parallel.ForEach(nodeDir.GetDirectories(), dir => { 
    // how do I write this? 
    }); 
    return list.ToArray(); 
} 

我该如何完成它?

编辑:

这是拉动目录和文件的列表,从我们的网络存储驱动器。通过网络获取信息目前是我们的瓶颈,但它是我学习一些并行处理技术的好地方。

+5

只需要注意,根据文件系统的不同,它可能不会加速,甚至可能会减慢应用程序的运行速度。 –

+0

如果您正在使用递归,那么在分析大型驱动器时,您可能会遇到堆栈溢出异常 – techno

+1

@techno:您觉得您需要缓冲多大才能溢出堆栈? – Gabe

回答

0

但你已经做到了!

public string[] RecurseFolders(string dirString) { 
     List<string> list = new List<string>(); 
     DirectoryInfo nodeDir = new DirectoryInfo(dirString); 
     Parallel.ForEach(nodeDir.GetDirectories(), dir => { 
//Just continue writing here. This is an Action. Google it for more info. But for the purposes of this example you may consider it as method which will be called for each of the items 
     }); 
     return list.ToArray(); 
    } 
+0

我不确定如何编写返回字符串值的Action。当我获得字符串值时,它们也将全部失灵。正确? – jp2code

+0

只要记住检查重新分析点,根据我对问题的评论。 – BlackWasp