[英]ParallelForEach get Directories c#
这是我到目前为止所做的,我不知道这是否是实现这个Parallel.ForEach
的最好方法,因为有时它会崩溃,有时候不会,你们可以告诉我我做错了什么或者我可以在这段代码上做些什么改进?
另外我的StopWatch
有一个问题,它在我的文本框中根本没有正确显示,总是在结束所有目录列表后停止....
private async void omplirParallel()
{
Stopwatch clock = new Stopwatch();
clock.Restart();
int contador = 0;
DirectoryInfo nodeDir = new DirectoryInfo(@"c:\files");
Parallel.ForEach(nodeDir.GetDirectories(), async dir =>
{
foreach (string s in Directory.GetFiles(dir.FullName))
{
Invoke(new MethodInvoker(delegate { lbxParallel.Items.Add(s); }));
contador++;
await Task.Delay(1);
}
});
await Task.Delay(1);
clock.Stop();
tbTimerParallel.Text = clock.Elapsed.TotalSeconds.ToString() + " segons";
tbcontadorParallel.Text = contador + " arxius";
}
编辑
这是我没有并行的ForEach,我尝试的是实现这个代码适应ParallalelForEach
Stopwatch stopWatch = new Stopwatch();
foreach (string d in Directory.GetDirectories(@"C:\files"))
{
foreach (string s in Directory.GetFiles(d))
{
stopWatch.Start();
listBox1.Items.Add(s);
await Task.Delay(1);
btIniciar1.Enabled = false;
}
}
btIniciar1.Enabled = true;
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
textBox1.Text = ts.ToString("mm\\:ss\\.ff") + (" minuts");
如果存在公共对象(共享对象),则paralel或线程可能会崩溃,因此您必须确保没有共享对象(例如,如果其中两个尝试编写,编辑或删除它将崩溃的共享对象,并且如果不是它不会崩溃)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.