以下是我迄今为止所做的事情,我不知道这是否是实现此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");
答案 0 :(得分:0)
如果存在公共对象(共享对象),则paralel或线程可能会崩溃,因此您必须确保没有共享对象(例如,如果其中两个尝试编写,编辑或删除共享对象,它将会崩溃,如果不是,它不会崩溃)。