微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Parallel.ForEach 与 Task.Run 和 Task.WhenAll

如何解决Parallel.ForEach 与 Task.Run 和 Task.WhenAll

在这种情况下,第二种方法将异步等待任务完成而不是阻塞。

但是,在循环中使用有一个缺点 - Task.RunWithParallel.ForEach,创建了一个Partitionerwhich 以避免执行不必要的任务。Task.Run将始终为每个项目创建一个任务(因为您正在执行此操作),但Parallel班级批次工作,因此您创建的任务少于总工作项目。这可以提供明显更好的整体性能,尤其是在循环体每个项目的工作量很小的情况下。

如果是这种情况,您可以通过以下方式组合这两个选项:

await Task.Run(() => Parallel.ForEach(strings, s =>
{
    DoSomething(s);
}));

请注意,这也可以写成更短的形式:

await Task.Run(() => Parallel.ForEach(strings, DoSomething));

解决方法

使用 Parallel.ForEach 或 Task.Run() 异步启动一组任务有什么区别?

版本 1:

List<string> strings = new List<string> { "s1","s2","s3" };
Parallel.ForEach(strings,s =>
{
    DoSomething(s);
});

版本 2:

List<string> strings = new List<string> { "s1","s3" };
List<Task> Tasks = new List<Task>();
foreach (var s in strings)
{
    Tasks.Add(Task.Run(() => DoSomething(s)));
}
await Task.WhenAll(Tasks);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。