Middle+
Existem casos em que não podemos cancelar as corutinas?
sobes.tech IA
Resposta da IA
Sim, existem.
Exemplos de tais casos:
- A coroutine realiza uma tarefa computacional longa sem verificações regulares de cancelamento. A coroutine verifica
isActiveapenas ao suspender (suspending). Se a tarefa não se suspender (por exemplo, um ciclo longo ou cálculos matemáticos), ela não perceberá a solicitação de cancelamento. - A manipulação de exceções de cancelamento não ocorre (por exemplo,
CancellationExceptionnão é capturada). A coroutine pode terminar, mas a coroutine pai ou o gerenciador de tarefas não saberão de seu cancelamento, e os recursos podem não ser liberados corretamente. - Uso de agendadores não cooperativos, como
Dispatchers.Unconfinedou um agendador com um pool de threads que não suporta Cancelamento Cooperativo. EmboraCancellationExceptionainda seja lançado, o comportamento pode ser imprevisível. - Uso de operações de entrada/saída bloqueantes sem envolvê-las em funções de suspensão (por exemplo, leitura de
InputStreamem um ciclo sem usarwithContext(Dispatchers.IO)e métodos de suspensão). Uma operação bloqueante não verifica o estado da coroutine nem lançaCancellationException.
Para que o cancelamento cooperativo funcione, a coroutine deve:
- Usar um agendador que suporte
Cooperative Cancellation(por exemplo,Dispatchers.Default,Dispatchers.IO,Dispatchers.Main). - Verificar regularmente
isActiveou usar funções de suspensão que o façam por ela. - Lidar corretamente com
CancellationException.