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
isActivepouze 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
CancellationExceptionnení 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.Unconfinednebo dispatcher s vláknovým bazénem, který nepodporuje Kooperativní zrušení. PřestožeCancellationExceptionbude 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
InputStreamv cyklu bez použitíwithContext(Dispatchers.IO)a suspending metod). Blokující operace nekontroluje stav korutiny a nevyhazujeCancellationException.
Pro kooperativní zrušení musí korutina:
- Používat dispatcher podporující
Cooperative Cancellation(napříkladDispatchers.Default,Dispatchers.IO,Dispatchers.Main). - Pravidelně kontrolovat
isActivenebo používat suspending funkce, které to dělají za ni. - Správně zpracovávat
CancellationException.