Sobes.tech
Middle+

Existují případy, kdy nemůžeme zrušit korutiny?

sobes.tech AI

Odpověď od AI

Ano, existují.

Příklady takových případů:

  • Korutina provádí dlouhý výpočet bez pravidelných kontrol na zrušení. Korutina kontroluje isActive pouze při pozastavení (suspending). Pokud úkol není pozastaven (například dlouhý cyklus nebo matematické výpočty), nezjistí žádost o zrušení.
  • Zpracování výjimek zrušení se neprovádí (například CancellationException není zachycena). Korutina může skončit, ale rodičovská korutina nebo správce úloh se o jejím zrušení nedozví, a zdroje nemusí být správně uvolněny.
  • Použití nekooperativních dispatcherů, jako je Dispatchers.Unconfined nebo dispatcher s vláknovým bazénem, který nepodporuje Kooperativní zrušení. Přestože CancellationException bude stále vyhozena, chování může být nepředvídatelné.
  • Použití blokujících operací vstupu/výstupu bez jejich zabalení do suspending funkcí (například čtení z InputStream v cyklu bez použití withContext(Dispatchers.IO) a suspending metod). Blokující operace nekontroluje stav korutiny a nevyhazuje CancellationException.

Pro kooperativní zrušení musí korutina:

  1. Používat dispatcher podporující Cooperative Cancellation (například Dispatchers.Default, Dispatchers.IO, Dispatchers.Main).
  2. Pravidelně kontrolovat isActive nebo používat suspending funkce, které to dělají za ni.
  3. Správně zpracovávat CancellationException.