using System.Diagnostics;
using System.Collections.Generic;
using System.Threading.Tasks;
public static class ExtensionMethods
static public async Task<List<T>> ToListAsync<T>(this IEnumerable<Task<T>> This)
var tasks = This.ToList();
var results = new List<T>();
foreach (var item in tasks)
private const int MillisecondsPerTask = 50;
private const int TasksPerTest = 10;
private const int TestIterations = 3;
public static object DoSomethingExpensive(int id)
Console.WriteLine("Handling task {0} synchronously", id);
System.Threading.Thread.Sleep(MillisecondsPerTask);
Console.WriteLine("Done handling task {0} synchronously", id);
public static async Task<object> DoSomethingExpensiveAsync(int id)
Console.WriteLine("Handling task {0} asynchronously", id);
await Task.Delay(MillisecondsPerTask);
Console.WriteLine("Done handling task {0} asynchronously", id);
public static void TestBlocking()
var pages = Enumerable.Range(0, TasksPerTest).Select
n => DoSomethingExpensive(n)
public static async Task TestAsync()
var pages = await Enumerable.Range(0, TasksPerTest).Select
async n => await DoSomethingExpensiveAsync(n)
public static async Task MainAsync()
for (int i = 0; i < TestIterations; i++)
var sw1 = new Stopwatch();
var sw2 = new Stopwatch();
Console.WriteLine("Sync: {0:0000} milliseconds\r\nAsync: {1:0000} milliseconds", sw1.ElapsedMilliseconds, sw2.ElapsedMilliseconds);
public static void Main()
MainAsync().GetAwaiter().GetResult();