Sobes.tech
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 isActive apenas 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, CancellationException nã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.Unconfined ou um agendador com um pool de threads que não suporta Cancelamento Cooperativo. Embora CancellationException ainda 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 InputStream em um ciclo sem usar withContext(Dispatchers.IO) e métodos de suspensão). Uma operação bloqueante não verifica o estado da coroutine nem lança CancellationException.

Para que o cancelamento cooperativo funcione, a coroutine deve:

  1. Usar um agendador que suporte Cooperative Cancellation (por exemplo, Dispatchers.Default, Dispatchers.IO, Dispatchers.Main).
  2. Verificar regularmente isActive ou usar funções de suspensão que o façam por ela.
  3. Lidar corretamente com CancellationException.