using System.Threading.Tasks;
public class AwaitOperator
private static DateTime startPoint;
private static void trace(object msg)
TimeSpan timeShift = DateTime.UtcNow - startPoint;
Console.WriteLine(String.Format("{0:D2}.{1:D3}: {2}", timeShift.Seconds, timeShift.Milliseconds, msg));
public static async Task Main()
startPoint = DateTime.UtcNow;
trace("Async pool launched");
Task<int> proc1 = Process1();
Task<int> proc2 = Process2();
Task<int> proc3 = Process3();
trace("Async pool complete");
private static async Task<int> Process1()
await Task.Run( () => Thread.Sleep(1500) );
trace("Process #1 exit");
private static async Task<int> Process2()
await Task.Run( () => Thread.Sleep(1000) );
trace("Process #2 exit");
private static async Task<int> Process3()
await Task.Run( () => Thread.Sleep(500) );
trace("Process #3 exit");