using System; using System.Threading; using System.Threading.Tasks; public class Program { public static void Main(string[] args) { Console.WriteLine("Main(): Started."); Console.WriteLine("Main(): Calling ComplexMethod..."); var complexMethodTask = Task.Run(() => ComplexMethod()); Console.WriteLine("Main(): Proceeding..."); Thread.Sleep(3500); Console.WriteLine("Main(): Waiting for ComplexMethod to finish..."); complexMethodTask.Wait(); Console.WriteLine("Main(): Finished."); } public static void ComplexMethod() { Console.WriteLine("ComplexMethod(): Started."); Thread.Sleep(1000); Console.WriteLine("ComplexMethod(): Calling WriteToFile method..."); var writeTask1 = Task.Run(() => WriteToFile()); Console.WriteLine("ComplexMethod(): Doing some other things..."); Thread.Sleep(2500); Console.WriteLine("ComplexMethod(): Calling WriteToFile method..."); var writeTask2 = Task.Run(() => WriteToFile()); Console.WriteLine("ComplexMethod(): Doing some other things..."); Thread.Sleep(2500); Console.WriteLine("ComplextMethod(): Waiting for both WriteToFile methods to finish..."); Task.WaitAll(writeTask1, writeTask2); Console.WriteLine("ComplexMethod(): Finished."); } public static void WriteToFile() { Console.WriteLine("WriteToFile(): Started."); Thread.Sleep(500); Console.WriteLine("WriteToFile(): Writing to a file is taking a long time..."); Thread.Sleep(4000); Console.WriteLine("WriteToFile(): Finished."); } }