2012-06-30 27 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