When to use OrderByCompletion (Jon Skeet) vs Parallel.ForEach with async delegates
async-await, c#, c#-5.0
Solution
Don't use `Parallel.ForEach` to execute `async` code. `Parallel.ForEach` doesn't understand `async`, so your lambda will be turned into `async void`, which won't work correctly (`Parallel.ForEach` will return before all work is done; exceptions won't be handled properly; possibly other issues).
Use something like `ForEachAsync()` when you have a collection of objects (not `Task`s), you want to perform some `async` action for each of them and the actions should execute in parallel.
Use `OrderByCompletion()` when you have a collection of `Task`s, you want perform some action (asynchronous or not) for the result of each `Task`, the actions should not execute in parallel and you want to execute the actions based on the order in which the `Task`s complete.
Problem
Recently Jon Skeet at NDC London spoke about C# 5 async/await and presented the idea of "ordering by completion" a list of async tasks. A link http://msmvps.com/blogs/jon_skeet/archive/2012/01/16/eduasync-part-19-ordering-by-completion-ahead-of-time.aspx I am a bit confused or should I say I am not sure when will this technique be more appropriate to use. I cannot understand the difference between this and the below example ``` var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, async item => { // some pre stuff var response = await GetData(item); bag.Add(response); // some post stuff } ``` or ForEachAsync as explained by Stephen Toub - http://blogs.msdn.com/b/pfxteam/archive/2012/03/05/10278165.aspx EDIT: Found a blog post from Stephen Toub explaining "Ordering by completion" <=> "Processing tasks as they complete". Worth reading. After reading this I could clearly understand the reasons how it works and also when to use this technique.