using System;
using System.Threading.Tasks;
using System.Threading;

namespace Prog_Asynchrone2
{
    class Program
    {
        static void Main(string[] args)
        {
            int cpt = 0;
            Console.WriteLine();
            Console.WriteLine(" Début d'exécution de la méthode Main.");
            LongTask myLongueTask = new LongTask();
            myLongueTask.Run();
            while (!myLongueTask.isCompleted)
            {
                Console.WriteLine($" {++cpt}: la longue tâche est en cours d'exécution.");
            }
            Console.WriteLine(" Fin du programme Main.");
            Console.ReadKey();
        }

    }

    class LongTask
    {
        public bool isCompleted = false;

        public async void Run()
        {
            Console.WriteLine(" Début d'exécution de la méthode Run.");
            int result = await RunLongTask();
            Console.WriteLine($" La valeur de retour de la méthode RunLongTask est égale à : {result}.");
            Console.WriteLine(" Fin de la méthode Run.");
        }

        private Task<int> RunLongTask()
        {
            return Task.Factory.StartNew(() =>
            {
                Console.WriteLine(" Début d'exécution de la méthode RunLongTask.");
                Thread.Sleep(5);
                isCompleted = true;
                Console.WriteLine(" Fin de l'exécution de la méthode RunLongTask.");
                return 10;
            });
        }
    }
}
