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.");
    }
}