Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

A notificação não funcionou! (2)

Testando o código de lançamento de exceção de acordo com a aula, eu não consegui capturar a exceção que deveria ocorrer. Acusava que não havia tratamento de exceção, no caso a OperationCanceledException.

static void Main(string[] args)
        {
            CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
            Console.WriteLine("Tecle algo para parar o relógio");
            Task contagem = new Task(() => ContagemRegressiva(cancelTokenSource.Token));
            contagem.Start();
            Console.ReadKey();
            if (contagem.IsCompleted)
            {
                Console.WriteLine("A contagem foi completada.");
            }
            else 
            { 
                try
                {
                    cancelTokenSource.Cancel();
                    contagem.Wait();
                }
                catch (OperationCanceledException ex) 
                {
                    Console.WriteLine("A contagem foi interrompida: " + ex.Message);
                } 
            }
            Console.ReadLine();
        }

        static void ContagemRegressiva(CancellationToken cancelToken)
        {
            int contador = 7;
            while (contador > -1 && !cancelToken.IsCancellationRequested)
            {
                Console.WriteLine("Contador: {0}", contador);
                Thread.Sleep(500);
                contador--;
            }
            cancelToken.ThrowIfCancellationRequested();
        }

Resolvi o problema, mas sem estar muito claro com o seguinte código. Segundo a documentação da Microsoft:

Wait(CancellationToken)

Waits for the Task to complete execution. The wait terminates if a cancellation token is canceled before the task completes.

static void Main(string[] args)
        {
            CancellationTokenSource cancelTokenSource = new CancellationTokenSource();
            Console.WriteLine("Tecle algo para parar o relógio");
            Task contagem = new Task(() => ContagemRegressiva(cancelTokenSource.Token));
            contagem.Start();
            Console.ReadKey();
            if (contagem.IsCompleted)
            {
                Console.WriteLine("A contagem foi completada.");
            }
            else 
            { 
                try
                {
                    cancelTokenSource.Cancel();
                    //Uando a sobrecarga do método Task.Wait passando como parâmetro o CancelationToken
                    contagem.Wait(cancelTokenSource.Token);
                }
                catch (OperationCanceledException ex) 
                {
                    Console.WriteLine("A contagem foi interrompida: " + ex.Message);
                } 
            }
            Console.ReadLine();
        }

        static void ContagemRegressiva(CancellationToken cancelToken)
        {
            int contador = 7;
            while (contador > -1 && !cancelToken.IsCancellationRequested)
            {
                Console.WriteLine("Contador: {0}", contador);
                Thread.Sleep(500);
                contador--;
            }
            //Removido o lançamento da exceção
            //cancelToken.ThrowIfCancellationRequested();
        }

Se alguém puder explicar, não entendi nem sei se o que fiz está fazendo o uso correto da sobrecarga do Wait().