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它将在Parallel中异步执行您的操作。
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



