gpt4 book ai didi

c# - 并行 forEach 搜索文件

转载 作者:行者123 更新时间:2023-11-30 20:23:33 27 4
gpt4 key购买 nike

我有一个包含 2 个列表框的程序,这个程序以搜索文件为基础,然后与 StopWatch 比较使用 AsyncAwait 和 TPL 的区别...第一个列表框使用 AsyncAwait 执行该功能(我不知道这是否是更好的方法,但它有效,请参阅下面的代码)

private async void button1_Click(object sender, EventArgs e)
{
Stopwatch stopWatch = new Stopwatch();
foreach (string d in Directory.GetDirectories(@"C:\Visual Studio Projectes\Hash\AsyncAwait\Carpetes"))
{
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 来表现得像 async,什么更好如何做到这一点?我找不到在这种情况下使用 TPL 来执行与我的第一个列表框相同的方法,你能帮帮我吗?

最佳答案

使用 async 没有意义在您的示例代码中,因为它实际上并没有异步执行任何操作。如果要将同步代码包装在后台线程中,请使用 Task.Run .

关于 Parallel.ForEach ,您可以通过将其包装在 Task.Run 中来异步处理它: await Task.Run(() => Parallel.ForEach(...));

请注意,并行/后台线程不能直接访问 UI 元素。您可以使用 IProgress<T>/Progress<T>如果您想从后台/线程池线程更新 UI。

更新:

串行代码如下所示:

private async void button1_Click(object sender, EventArgs e)
{
IProgress<string> progress = new Progress<string>(update =>
{
listBox1.Items.Add(s);
btIniciar1.Enabled = false;
});
var ts = await Task.Run(() =>
{
Stopwatch stopWatch = new Stopwatch();
foreach (string d in Directory.GetDirectories(@"C:\Visual Studio Projectes\Hash\AsyncAwait\Carpetes"))
{
foreach (string s in Directory.GetFiles(d))
{
stopWatch.Start();
progress.Report(s);
}
}
stopWatch.Stop();
return stopWatch.Elapsed;
});
btIniciar1.Enabled = true;
textBox1.Text = ts.ToString("mm\\:ss\\.ff") + (" minuts");
}

并行代码如下所示:

private async void button1_Click(object sender, EventArgs e)
{
IProgress<string> progress = new Progress<string>(update =>
{
listBox1.Items.Add(s);
btIniciar1.Enabled = false;
});
var ts = await Task.Run(() => Parallel.ForEach( ...
));
btIniciar1.Enabled = true;
textBox1.Text = ts.ToString("mm\\:ss\\.ff") + (" minuts");
}

关于c# - 并行 forEach 搜索文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28699452/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com