Veamos cómo utilizar un token de cancelación cuando necesitamos cancelar peticiones entre subprocesos o en procesos del tipo TASK.
Cada tarea que ejecutamos en un hilo o mediante una tarea asincrónica lleva tiempo de ejecución y se procesa en segundo plano. En ocasiones, puede ser necesario cancelar el proceso en ejecución, sea porque está tomando demasiado tiempo, consume excesivos recursos o simplemente ya no necesitamos los resultados solicitados.
Hay muchas ventajas como comentamos:
- Control de Cancelación: Los tokens de cancelación permiten un control más efectivo y consistente sobre la cancelación de operaciones en comparación con otras técnicas, como el uso de variables de bandera.
- Coordinación entre Subprocesos: Facilitan la coordinación entre diferentes subprocesos o tareas asincrónicas al proporcionar un mecanismo estandarizado para la cancelación.
- Manejo de Operaciones Prolongadas: Son especialmente útiles en operaciones que pueden tomar un tiempo considerable, permitiendo la cancelación de estas operaciones si se vuelven innecesarias o si exceden los límites de tiempo establecidos.
- Evita Recursos Desperdiciados: Ayudan a evitar el desperdicio de recursos al permitir la interrupción de operaciones que ya no son necesarias, liberando recursos de manera oportuna.
- Interoperabilidad y Consistencia: Proporcionan un enfoque consistente y seguro para la cancelación que puede ser utilizado en diferentes partes del código y garantiza la interoperabilidad entre componentes y librerías.
- Manejo de Situaciones de Error: Permiten manejar situaciones de error de manera más controlada al proporcionar una manera estandarizada de notificar la cancelación de operaciones.
- Compatibilidad con E/S Asíncrona: Son esenciales en operaciones de entrada/salida asincrónica donde la cancelación puede ser crucial para mantener una aplicación ágil y responsiva.
- Implementación de Políticas de Cancelación: Permiten implementar políticas de cancelación basadas en criterios específicos, como límites de tiempo o condiciones de negocio.
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 buena 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 tokens 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 método 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 artículo, hemos explorado de manera concisa el uso de tokens de cancelación. Esta práctica, de alto valor, no solo nos proporciona un mecanismo efectivo para controlar la cancelación de operaciones, sino que también se revela como una buena práctica esencial. La implementación adecuada de tokens de cancelación contribuye significativamente a la eficiencia de nuestros procesos, evitando el desperdicio innecesario de recursos y tiempo. La incorporación sistemática de esta técnica en nuestros desarrollos no solo mejora la gestión de operaciones prolongadas, sino que también establece un estándar robusto para la consistencia y el control en la programación asincrónica y multihilo.