何时使用OrderByCompletion(Jon Skeet)和Parallel.ForEach与异步委托

Gur*_*rni 6 c# async-await c#-5.0

最近,NDC伦敦的Jon Skeet谈到了C#5 async/await,并提出了" 按完成排序 " 的想法,列出了异步任务.链接http://msmvps.com/blogs/jon_skeet/archive/2012/01/16/eduasync-part-19-ordering-by-completion-ahead-of-time.aspx

我有点困惑,或者我应该说我不确定这种技术何时更适合使用.

我无法理解这个和下面的例子之间的区别

var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
  // some pre stuff
  var response = await GetData(item);
  bag.Add(response);
  // some post stuff
}
Run Code Online (Sandbox Code Playgroud)

或由Stephen Toub解释的ForEachAsync - http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx

编辑:发现一篇来自Stephen Toub的博客文章解释"按完成排序"<=>"处理任务完成后".值得阅读.阅读本文后,我可以清楚地了解它的工作原理以及何时使用这种技术.

svi*_*ick 16

  • 不要Parallel.ForEach用来执行async代码.Parallel.ForEach不明白async,所以你的lambda将被转换为async void无法正常工作(Parallel.ForEach将在所有工作完成之前返回;异常将无法正确处理;可能还有其他问题).

  • 使用类似于ForEachAsync()拥有对象集合(而不是Tasks)的东西时,您希望async为每个对象执行某些操作,并且操作应该并行执行.

  • 使用OrderByCompletion()时,你有集合TaskS,你要执行的每个结果的一些动作(异步与否)Task,该行动应不并行执行,并且希望基于该顺序在其中执行行动Task氏完全.

  • 在Stephen Toub的博客中记录了[ForEachAsync](http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx)方法. (3认同)