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
isActivecuando 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.Unconfinedo un planificador con un grupo de hilos que no soporta la Cancelación Cooperativa. AunqueCancellationExceptionaú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
InputStreamen un ciclo sin usarwithContext(Dispatchers.IO)y métodos de suspensión). Una operación bloqueante no verifica el estado de la coroutine ni lanzaCancellationException.
Para que la cancelación cooperativa funcione, la coroutine debe:
- Usar un planificador que soporte
Cooperative Cancellation(por ejemplo,Dispatchers.Default,Dispatchers.IO,Dispatchers.Main). - Verificar regularmente
isActiveo usar funciones de suspensión que lo hagan por ella. - Manejar correctamente
CancellationException.