C# - Cancelamento de operações assíncronas - III


Hoje vamos continuar mostrando como cancelar operações assíncronas na linguagem C#.

Continuando o artigo anterior veremos agora como cancelar uma operação manualmente.

Nos artigos anteriores mostramos como cancelar uma operação assíncrona de forma imediata e também após um intervalo de tempo definido.

Veremos agora como permitir que o usuário cancele manualmente uma operação assíncrona de longa duração.

Cancelando uma operação manualmente

Para mostrar o cancelamento manual eu vou usar uma aplicação Console mas você pode adaptar o código para outros tipos de aplicações suportadas na plataforma .NET Como Windows Forms, WPF, Mobile, Web, etc.

Neste exemplo para cancelar a tarefa vamos usar o método CancellationTokenSource.Cancel.

Abaixo temos o método ExecutaCancelamentoManual() que é usado em uma aplicação console e por isso estamos iniciando uma nova task para cancelar a operação quando uma tecla for pressionada.

        public static async Task ExecutaCancelamentoManual()
        {
            using (var cancellationTokenSource = new CancellationTokenSource())
            {
                var TecladoTask = Task.Run(() =>
                {
                    Console.WriteLine("Pressione algo para Cancelar…");
                    Console.ReadKey();
                    cancellationTokenSource.Cancel();
                });
                try
                {
                    var tarefa = OperacaoLongaDuracaoCancelavel(500, cancellationTokenSource.Token);
                    var resultado = await tarefa;
                    Console.WriteLine($"Resultado {resultado}");
                }
                catch (TaskCanceledException)
                {
                    throw;
                }
                await TecladoTask;
            }
        }

Em um aplicativo baseado em interface mais rica como um aplicativo Xamarin Forms, Windows Forms ou WPF os botões ou eventos de navegação são mais propensos a servir como gatilho de cancelamento.

A chamada do método ExecutaCancelamentoManual() no método Main é visto a seguir:

        static async Task Main(string[] args)
        {
            var stopwatch = new Stopwatch();
            stopwatch.Start();
            try
            {
                await ExecutaCancelamentoManual();
            }
            catch (Exception)
            {
                Console.WriteLine($"Tarefa cancelada: " +
               $"tempo expirado após {stopwatch.Elapsed }.\n");
            }
            Console.ReadKey();
        }

Executando o projeto teremos o resultado abaixo:

Pegue o projeto aqui:  CShp_TaskCancel.zip

"Rogo-vos, pois, irmãos, pela compaixão de Deus, que apresenteis os vossos corpos em sacrifício vivo, santo e agradável a Deus, que é o vosso culto racional."
Romanos 12:1

Referências:


José Carlos Macoratti