Sobes.tech
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 isActive iba 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, CancellationException sa 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.Unconfined alebo dispatcher s vláknovým bazénom, ktorý nepodporuje Kooperatívne Zrušenie. Hoci CancellationException bude 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 InputStream v cykle bez použitia withContext(Dispatchers.IO) a suspending metód). Blokujúca operácia nekontroluje stav korutiny a nevyhadzuje CancellationException.

Pre kooperatívne zrušenie musí korutina:

  1. Používať dispatcher, ktorý podporuje Cooperative Cancellation (napríklad, Dispatchers.Default, Dispatchers.IO, Dispatchers.Main).
  2. Pravidelne kontrolovať isActive alebo používať suspending funkcie, ktoré to robia za ňu.
  3. Správne spracovávať CancellationException.