2016-03-21 109 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的();