Parallel.ForEach与Task.Run和Task.WhenAll

使用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", "s2", "s3" };

List<Task> Tasks = new List<Task>();

foreach (var s in strings)

{

Tasks.Add(Task.Run(() => DoSomething(s)));

}

await Task.WhenAll(Tasks);

回答:

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

但是,Task.Run在循环中使用Parallel.ForEach时有一个缺点-With

Partitioner它的创建是为了避免执行不必要的任务。

Task.Run(因为您正在执行此操作)将始终为每个项目执行单个任务,但是Parallel类批次可以工作,因此您创建的任务少于总工作项。这可以提供明显更好的整体性能,尤其是在循环体每个项目工作量较小的情况下。

在这种情况下,可以通过编写以下两种方法来组合使用:

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

{

DoSomething(s);

}));

请注意,这也可以用以下简短形式编写:

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

以上是 Parallel.ForEach与Task.Run和Task.WhenAll 的全部内容, 来源链接: utcz.com/qa/412664.html

回到顶部