using System.Diagnostics;
using System.Threading.Tasks;
public static void Main()
private static async Task Test() {
await Measure("ForEach", CodeWithForEach(CreateTasks(3)));
await Measure("WhenAll", CodeWithWhenAll(CreateTasks(3)));
private static async Task Measure(string testName, Task task) {
var stopWatch = new Stopwatch();
Console.WriteLine($"{testName} took {stopWatch.Elapsed}.");
private static Task[] CreateTasks(int n) {
Console.WriteLine($"Creating {n} tasks with durations from 1s to {n}s:");
return Enumerable.Range(1, n).Select(i => Task.Delay(i * 1000)).ToArray();
private static async Task CodeWithWhenAll(Task[] tasks) {
await Task.WhenAll(tasks);
private static async Task CodeWithForEach(Task[] tasks) {
foreach(var task in tasks) {