public async Task t3_async_can_await_events() { Workflow w = new Workflow(); // Simulate people working on workflow (on separate thread) Task.Run(() => { Thread.Sleep(100); w.ManagerReview("Looks great! -manager"); w.LegalReview("We're covered. -legal"); w.Approve(); }); // Business logic separated from workflow capabilities Console.WriteLine("Awaiting reviews"); await Task.WhenAll( w.WhenLegalReviewed(), w.WhenManagerReviewed()); Console.WriteLine("Have all reviews"); Console.WriteLine("Awaiting approval"); await w.WhenApproved(); Console.WriteLine("Have final approval, workflow finished"); }