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().