0

Cómo usar Token de Cancelación en las peticiones

Veamos cómo utilizar token de cancelación cuando necesitamos cancelar peticiones entre subprocesos o en procesos del tipo TASK.

Cada tarea que ejecutamos en un hilo o en un Task asincrónica lleva tiempo ejecutarla y esta se estará ejecutando en segundo plano. En algunos casos es posible que deseemos cancelar el proceso que se está ejecutando sea por que está tardando mucho, excede los recursos o simplemente ya no necesitamos lo que solicitamos.

Hay muchas ventajas como comentamos:

  • Cancelación de operaciones asincrónicas u operaciones sincrónicas de larga duración
  • Protección de la CPU de recursos y grupos de subprocesos.
  • Evitar la duplicación de registros al crear, actualizar o eliminar.
  • Ahorro de tiempo al no ejecutar la tarea.

En C# utilizaremos el objeto quiero llamar CancellationToken. Este es creado por la instancia de CancellationToleSource. Esto quiere decir que cuando se cancele este todos los consumidores del CacellationToken serán notificados para cancelar los procesos.

Cuando estamos en un entorno web y tenemos tareas que pueden tomar bastante tiempo es una buen práctica utilizar token de cancelación y cancelar las peticiones

En el post anterior vimos el uso de MinimalAPI así que haremos uso de estos token dentro de un minimal. Simularemos una petición que dure mucho tiempo para poder ver la funcionalidad en acción.

app.MapGet("/test", async () =>
{
    app.Logger.LogInformation("Request started at: "+DateTime.Now.ToLongTimeString());
    await Task.Delay(TimeSpan.FromSeconds(5));
    app.Logger.LogInformation("Request completed at: " + DateTime.Now.ToLongTimeString());
    return "Success";
});

En este ejemplo de código todavía no tenemos implementado nuestro token de cancelación. Veamos cómo hacerlo. Lo primero que debemos hacer es agregar que nuestro metodo async reciba CancelationToken.

app.MapGet("/test", async (CancellationToken token) =>
{
    app.Logger.LogInformation("Request started at: " + DateTime.Now.ToLongTimeString());
    await Task.Delay(TimeSpan.FromSeconds(5), token);
    app.Logger.LogInformation("Request completed at: " + DateTime.Now.ToLongTimeString());
    return "Success";
});

Al ejecutar nuestra aplicación y consumamos el endpoint test y la invocamos del navegador, nuestro endpoint cancela la petición si el usuario, por ejemplo, vuelve a llamar o actualiza el navegador.

Por otro lado, es posible capturar la excepción si es necesaria por medio de la excepción TaskCanceledException.

try{

}catch(TaskCanceledException ex){
       throw;
}

Esto permitirá que la aplicación pueda seguir procesando nuevas solicitudes pero si se cancela dispara la excepción.

Conclusiones

En este post vimos en alto nivel como utilizar un token de cancelación. Ten presente que es una buena práctica la cual nos ayudará a no malgastar recursos y tiempo en nuestros procesos.

Fernando Sonego

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *