O foco desse artigo será demonstrar como utilizar o CancellationToken em uma aplicação .NET Core, através de um exemplo rápido e prático.
Bom, imagine o seguinte cenário: Você tem uma API que retorna uma lista de um conteudo X.
Até aqui um cenário normal do nosso dia a dia correto?
Indo para parte do código, eu estou utilizando a controller WeatherForecastController, que é criada através de um template do .NET.
Eu fiz alguns ajustes nela para logar inicio do request, final do request e um Task.Delay de 15 segundos (sim é um tempo grande para que possamos ver os logs), para simular uma pesquisa em uma banco de dados que vai retornar os dados em result.
Executando esta aplicação, nós temos o seguinte resultado na console do projeto:
Até aqui tudo normal né?
Agora, caso um usuário X pense que a sua aplicação esta um pouco lenta e precione algumas vezes o F5 no navegador? O que aconteceria com o primeiro request e com os novos ?
Para entender esse fluxo melhor, vamos alterar o código adicionando CancellationToken:
E executando o código novamente nós teriamos o seguinte resultado:
Exatamente isso que você pode ver na imagem acima, a sua aplicação vai processar todos requests do usuário como novos e toda vez que o usuário precionar o F5 para atualizar a página, a sua aplicação vai interpretar como uma nova requisição.
Para resolver esse problema nós podemos utilizar o cancellationToken.
Adicionando ele no nosso exemplo anterior, nós teriamos o seguinte resultado:
Como você pode ver na imagem acima, quando um usuário atualizar a página será gerada uma exception cancelando a requisição anterior criando uma nova requisição.
Com essa implementação nós podemos tratar a exception gerada pelo novo request, evitando duplicação de registros ou outros tipos de problemas no momento de criar, atualizar ou deletar alguma informação através de uma nova request.
Bom, a ideia desse post era de ser algo rápido e pratico demostrando a importancia da utilização do CancellationToken.
Espero que tenham gostado e até um próximo artigo pessoal.