Middle+
Existujú prípady, keď nemôžeme zrušiť korutíny?
sobes.tech AI
Odpoveď od AI
Áno, existujú.
Príklady takýchto prípadov:
- Korutina vykonáva dlhú výpočtovú úlohu bez pravidelných kontrol na zrušenie. Korutina kontroluje
isActiveiba pri pozastavení (suspending). Ak úloha nie je pozastavená (napríklad dlhý cyklus alebo matematické výpočty), nezistí požiadavku na zrušenie. - Spracovanie výnimiek zrušenia sa neuskutočňuje (napríklad,
CancellationExceptionsa nezachytáva). Korutina sa môže ukončiť, ale rodičovská korutina alebo manažér úloh sa o jej zrušení nedozvie, a zdroje nemusia byť správne uvoľnené. - Použitie nekooperatívnych dispatcherov, ako je
Dispatchers.Unconfinedalebo dispatcher s vláknovým bazénom, ktorý nepodporuje Kooperatívne Zrušenie. HociCancellationExceptionbude stále vyhodená, správanie môže byť nepredvídateľné. - Použitie blokujúcich operácií vstupu/výstupu bez ich zabalenia do suspending funkcií (napríklad čítanie z
InputStreamv cykle bez použitiawithContext(Dispatchers.IO)a suspending metód). Blokujúca operácia nekontroluje stav korutiny a nevyhadzujeCancellationException.
Pre kooperatívne zrušenie musí korutina:
- Používať dispatcher, ktorý podporuje
Cooperative Cancellation(napríklad,Dispatchers.Default,Dispatchers.IO,Dispatchers.Main). - Pravidelne kontrolovať
isActivealebo používať suspending funkcie, ktoré to robia za ňu. - Správne spracovávať
CancellationException.