using System.Collections.Generic;
using System.Threading.Tasks;
public static async Task Main()
await WithContinuation();
public static async Task WithContinuation() {
Console.WriteLine($"Begin {nameof(WithContinuation)}");
List<Task<bool?>> tasks = BuildTasks();
Console.WriteLine($"\ttasks has {tasks.Count} total entries, 2 with exceptions");
IEnumerable<bool?> results = await Task.WhenAll(tasks)
.ContinueWith((Task<bool?[]> t) => tasks.Where(st => st.Exception == null).Select(st => st.Result));
bool?[] completedResults = results.Select(r => {
Console.WriteLine($"\t\t\tresult: {r}");
Console.WriteLine($"\tcompletedResults has {completedResults.Length} total entries");
Console.WriteLine($"End {nameof(WithContinuation)}");
public static async Task TryCatchWhenAll() {
Console.WriteLine($"Begin {nameof(TryCatchWhenAll)}");
List<Task<bool?>> tasks = BuildTasks();
Console.WriteLine($"\ttasks has {tasks.Count} total entries, 2 with exceptions");
IEnumerable<bool?> results = null;
var allTasksTask = Task.WhenAll(tasks);
IEnumerable<bool?> taskResults = await allTasksTask;
catch (AggregateException ex) {
Console.WriteLine($"\tcaught aggregate exception: {ex.InnerExceptions.Count}");
Console.WriteLine($"\tcaught exception: {ex.Message}");
if (allTasksTask.Exception != null) {
Console.WriteLine($"\twhenall exception: {allTasksTask.Exception.GetType()}");
bool?[] completedResults = tasks.Where(t => t.Exception == null && t.IsCompletedSuccessfully).Select(t => {
Console.WriteLine($"\t\t\tresult: {t.Result}");
Console.WriteLine($"\tcompletedResults has {completedResults.Length} total entries");
Console.WriteLine($"End {nameof(TryCatchWhenAll)}");
public static List<Task<bool?>> BuildTasks() {
List<Task<bool?>> tasks = new ();
tasks.Add(Task.FromResult((bool?)true));
tasks.Add(Task.FromException<bool?>(new ArgumentNullException("message")));
tasks.Add(Task.FromResult((bool?)true));
tasks.Add(Task.FromResult((bool?)false));
tasks.Add(Task.FromException<bool?>(new Exception("second Exception")));
tasks.Add(GetActualTask());
async public static Task<bool?> GetActualTask() {
Console.WriteLine("\t\tDelayed task finished");