并行 ForEach 获取目录 c#
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");
并行,否则如果有公共对象(共享对象),线程可能会崩溃,所以你必须确保没有共享对象(例如,如果其中两个试图写入,编辑或删除共享对象它会崩溃,如果没有它不会崩溃)。
这是我目前所做的,我不知道这是否是最好的实现方式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");
并行,否则如果有公共对象(共享对象),线程可能会崩溃,所以你必须确保没有共享对象(例如,如果其中两个试图写入,编辑或删除共享对象它会崩溃,如果没有它不会崩溃)。