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.
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: