int[] ids = new[] { 1, 2, 3, 4, 5 };
Parallel.ForEach(ids, i => DoSomething(1, i, blogClient).Wait());
尽管您与上述代码并行运行操作,但此代码会阻塞每个操作运行的每个线程。例如,如果网络调用需要 2 秒,则每个线程将挂起 2 秒,除了等待之外不执行任何操作。
int[] ids = new[] { 1, 2, 3, 4, 5 };
Task.WaitAll(ids.Select(i => DoSomething(1, i, blogClient)).ToArray());
另一方面,上面的代码WaitAll
还会阻塞线程,并且您的线程在操作结束之前将无法自由处理任何其他工作。
推荐方法
我会比较喜欢WhenAll
它将并行异步执行您的操作。
public async Task DoWork() {
int[] ids = new[] { 1, 2, 3, 4, 5 };
await Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}
事实上,在上述情况下,你甚至不需要await
,您可以直接从该方法返回,因为您没有任何延续:
public Task DoWork()
{
int[] ids = new[] { 1, 2, 3, 4, 5 };
return Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}
为了支持这一点,这里有一篇详细的博客文章,涵盖了所有
替代方案及其优点/缺点:如何以及在何处使用 ASP.NET Web API 进行并发异步 I/O http://www.tugberkugurlu.com/archive/how-and-where-concurrent-asynchronous-io-with-asp-net-web-api