2016-03-21 58 views
-1

我有這個兩個方法如何從遞歸方法返回,然後從最後返回的點繼續遞歸方法?

private List<DirectoryInfo> GetDirectories(string basePath) 
     { 
      IEnumerable<string> str = MyGetDirectories(basePath); 

      List<DirectoryInfo> l = new List<DirectoryInfo>(); 
      l.Add(new DirectoryInfo(basePath)); 

      IEnumerable<DirectoryInfo> dirs = str.Select(a => new DirectoryInfo(a)); 
      l.AddRange(dirs); 

      return l; 
     } 

而且

static int countDirectories = 0; 
    private IEnumerable<string> MyGetDirectories(string basePath) 
    { 
     try 
     { 
      string[] dirs = Directory.GetDirectories(basePath); 
      if (dirs.Length > 0) 
       return dirs.Union(dirs); 
      countDirectories = countDirectories + dirs.Length; 
      _FileInformationWorker.ReportProgress(countDirectories,dirs); 
      return dirs.Union(dirs.SelectMany(dir => MyGetDirectories(dir))); 
     } 
     catch (UnauthorizedAccessException) 
     { 
      return Enumerable.Empty<string>(); 
     } 
    } 

而且在一個BackgroundWorker的DoWork這

private void _FileInformationWorker_DoWork(object sender, DoWorkEventArgs e) 
     {    
      MySubDirectories = GetDirectories(BasePath).ToArray(); 
     } 

而不是等待方法MyGetDirectories來完成我想在DoWork的更新事件變量MySubDirectories每次變量dirs。更改。在這種情況下,第一次目錄長度是36,所以我做回報,我看到MySubDirectories包含36項。現在的問題是方法MyGetdirectories中的遞歸不會繼續。我希望它繼續下一次dirs長度大於0,例如下一次它將是3,然後更新MySubDirectories,所以現在MySubDirectories將包含在dirs中的新3項。

我不想停止遞歸我只是想實時更新MySubDirectories。

我試過到目前爲止並沒有在方法MyGetdirectories我也是報告顯示目錄變量:在progresschanged事件

_FileInformationWorker.ReportProgress(countDirectories, dirs); 

然後做:

List<string[]> testing = new List<string[]>(); 
     private void _FileInformationWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
     { 
      label2.Text = e.ProgressPercentage.ToString(); 
      string[] test = (string[])e.UserState; 
      if (test.Length > 0) 
       testing.Add(test); 
     } 

但我現在m以string []數組的列表結尾。和測試是字符串[] 有什麼辦法將字符串[]轉換/轉換爲DirectoryInfo []?

回答

0

https://www.microsoft.com/en-us/download/details.aspx?id=14782

// Hand-off through a BufferBlock<T> 
private static BufferBlock<int> m_buffer = new BufferBlock<int>(); 

// Producer 
private static void Producer() 
{ 
    while(true) 
    { 
     int item = Produce(); 
     m_buffer.Post(item); 
    } 
} 

// Consumer 
private static async Task Consumer() 
{ 
    while(true) 
    { 
     int item = await m_buffer.ReceiveAsync(); 
     Process(item); 
    } 
} 

// Main 
public static void Main() 
{ 
    var p = Task.Factory.StartNew(Producer); 
    var c = Consumer(); 
    Task.WaitAll(p,c); 
} 
-1

這應該工作:

test.Select(p值=>新DirectoryInfo的(P))ToArray的();