【发布时间】:2013-10-06 19:58:54
【问题描述】:
使用 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.WaitAll而不是Task.WhenAll,我认为第二个代码片段几乎等于第一个。 -
另请注意,第二个将执行 DoSomething("s3") 三次,它不会产生相同的结果! stackoverflow.com/questions/4684320/…
-
@Dan:请注意,版本 2 使用 async/await,这意味着这是一个不同的问题。 Async/await 是在 VS 2012 中引入的,在编写可能的重复线程 1.5 年后。
-
@Nullius,从 C#5 开始,捕获的变量的行为符合预期,上面的循环对三个字符串中的每一个执行 DoSomething,例如stackoverflow.com/questions/12112881/…。这个问题显然是针对 C#5 的,因为 Task.WhenAll 是在 C#5 和 .NET Framework 4.5 中引入的。所以第二个执行 DoSomething("s3") 三次是不正确的。
标签: c# async-await parallel.foreach