如何从递归方法返回,然后从最后一个返回点继续递归方法



我有这两个方法

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>();
        }
    }

在后台工作

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

而不是等待方法MyGetDirectory完成,我想在dowork事件中更新变量MySubDirectory,每次变量目录更改。在这种情况下,第一次目录长度是 36,所以我返回,我看到 MySubDirectory 包含 36 个项目。现在的问题是 MyGetdirectory 方法中的递归不会继续。我希望它继续,以便下次目录长度高于 0,例如下次它将是 3 然后更新 MySubDirectory,所以现在 MySubDirectory 将包含目录中的新 3 个项目。

不想停止递归,我只想实时更新 MySubDirectory。

到目前为止,我尝试并所做的是在MyGetdirectory方法中,我也报告了dirs变量:

_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);
        }

但是现在我以 string[] 数组列表结束。测试是字符串[]有没有办法将字符串 [] 转换为目录信息[]?

来自 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);
}

这应该有效:

测试。选择(p => new DirectoryInfo(p))。ToArray();

最新更新