Sobes.tech
Middle+

¿Existen casos en los que no podamos cancelar las corrutinas?

sobes.tech AI

Respuesta de la IA

Sí, existen.

Ejemplos de tales casos:

  • La coroutine realiza una tarea computacional larga sin verificaciones regulares de cancelación. La coroutine solo verifica isActive cuando se suspende (suspending). Si la tarea no se suspende (por ejemplo, un ciclo largo o cálculos matemáticos), no detectará la solicitud de cancelación.
  • No se maneja la excepción de cancelación (por ejemplo, no se captura CancellationException). La coroutine puede terminar, pero la coroutine padre o el gestor de tareas no sabrán de su cancelación, y los recursos pueden no liberarse correctamente.
  • Uso de planificadores no cooperativos, como Dispatchers.Unconfined o un planificador con un grupo de hilos que no soporta la Cancelación Cooperativa. Aunque CancellationException aún será lanzada, el comportamiento puede ser impredecible.
  • Uso de operaciones de entrada/salida bloqueantes sin envolverlas en funciones de suspensión (por ejemplo, leer de InputStream en un ciclo sin usar withContext(Dispatchers.IO) y métodos de suspensión). Una operación bloqueante no verifica el estado de la coroutine ni lanza CancellationException.

Para que la cancelación cooperativa funcione, la coroutine debe:

  1. Usar un planificador que soporte Cooperative Cancellation (por ejemplo, Dispatchers.Default, Dispatchers.IO, Dispatchers.Main).
  2. Verificar regularmente isActive o usar funciones de suspensión que lo hagan por ella.
  3. Manejar correctamente CancellationException.