我有这两个方法
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();