using System.Collections.Generic;
using System.Diagnostics;
using System.Threading.Tasks;
public static async Task Main()
long startTime = Stopwatch.GetTimestamp();
for (int i = 0; i <= 3; i++)
var indexes = new List<int> { 0, 1, 2, 3 };
var tasks = indexes.Select(async key => await DoWorkAsync($"Task {key}", key));
await Task.WhenAll(tasks);
var elapsedTime = Stopwatch.GetElapsedTime(startTime);
Console.WriteLine($"Time taken: {elapsedTime.ToString(@"m\:ss\.fff")}");
Console.WriteLine("Main ended");
public static async Task DoWorkAsync(string nameOfTask, int secondsToDelay)
throw new Exception("Seconds to delay cannot less than 0.");
Console.WriteLine($"{nameOfTask} has started.");
await Task.Delay(secondsToDelay * 1000);
Console.WriteLine($"{nameOfTask} has finished.");