using System.Collections.Generic;
using System.Threading.Tasks;
public async Task DoWork(DateTime testStart)
var workerStart = DateTime.Now;
Console.WriteLine("Worker {0} started on thread {1}, beginning {2} seconds after test start.",
Id, Thread.CurrentThread.ManagedThreadId, (workerStart - testStart).TotalSeconds.ToString("F2"));
await Task.Run(() => Thread.Sleep(SleepTimeout));
var workerEnd = DateTime.Now;
Console.WriteLine("Worker {0} stopped; the worker took {1} seconds, and it finished {2} seconds after the test start.",
Id, (workerEnd - workerStart).TotalSeconds.ToString("F2"), (workerEnd - testStart).TotalSeconds.ToString("F2"));
static async Task Main(string[] args)
var workers = new List<Worker>
new Worker { Id = 1, SleepTimeout = 1000 },
new Worker { Id = 2, SleepTimeout = 2000 },
new Worker { Id = 3, SleepTimeout = 3000 },
new Worker { Id = 4, SleepTimeout = 4000 },
new Worker { Id = 5, SleepTimeout = 5000 },
await RunTasksWithWhenAll(workers);
Console.WriteLine(Environment.NewLine);
await RunTasksWithWhenAllAsync(workers);
private static async Task RunTasksAwaitEachOne(List<Worker> workers)
var startTime = DateTime.Now;
Console.WriteLine("Starting test: await");
foreach (var worker in workers)
await worker.DoWork(startTime);
var endTime = DateTime.Now;
Console.WriteLine("Test finished after {0} seconds.\n",
(endTime - startTime).TotalSeconds.ToString("F2"));
private static async Task RunTasksWithWhenAllAsync(List<Worker> workers)
var startTime = DateTime.Now;
Console.WriteLine("Starting test: Task.WhenAllWithAsync");
var tasks = workers.Select(async worker => await worker.DoWork(startTime));
await Task.WhenAll(tasks);
var endTime = DateTime.Now;
Console.WriteLine("Test finished after {0} seconds.\n",
(endTime - startTime).TotalSeconds.ToString("F2"));
private static async Task RunTasksWithWhenAll(List<Worker> workers)
var startTime = DateTime.Now;
Console.WriteLine("Starting test: Task.WhenAllWithoutAsync");
var tasks = workers.Select(worker => worker.DoWork(startTime));
await Task.WhenAll(tasks);
var endTime = DateTime.Now;
Console.WriteLine("Test finished after {0} seconds.\n",
(endTime - startTime).TotalSeconds.ToString("F2"));
static Task PerformTest_TaskWhenAll(List<Worker> workers, DateTime testStart)
return Task.WhenAll(workers.Select(worker => worker.DoWork(testStart)));