Middle+
Vai ir gadījumi, kad mēs nevaram atcelt korutinas?
sobes.tech AI
Atbilde no AI
jā, pastāv.
Šādu gadījumu piemēri:
- Korutina veic ilgu skaitļošanas uzdevumu bez regulārām pārbaudēm par atcelšanu. Korutina pārbauda
isActivetikai suspending laikā. Ja uzdevums netiek pārtraukts (piemēram, ilgs cikls vai matemātiskie aprēķini), tas neuzzinās par atcelšanas pieprasījumu. - Atcelšanas izņēmumu apstrāde nenotiek (piemēram,
CancellationExceptionnetiek noķerts). Korutina var beigties, bet vecāka korutina vai uzdevumu pārvaldnieks neuzzinās par tās atcelšanu, un resursi var netikt pareizi atbrīvoti. - Nepartneru dispečeri, piemēram,
Dispatchers.Unconfinedvai dispečers ar pavedienu baseinu, kas nepārstāv Kooperatīvo Atcelšanu. Lai arīCancellationExceptionjoprojām tiks izsviesta, uzvedība var būt neparedzama. - Bloķējošas ievades/izvades operācijas bez to ietveršanas suspending funkcijās (piemēram, lasīšana no
InputStreamciklā bezwithContext(Dispatchers.IO)un suspending metodēm). Bloķējoša operācija nepatikrina korutinas stāvokli un neizmetCancellationException.
Lai nodrošinātu kooperatīvu atcelšanu, korutina ir:
- Jāizmanto dispečers, kas atbalsta
Cooperative Cancellation(piemēram,Dispatchers.Default,Dispatchers.IO,Dispatchers.Main). - Regulāri jāpārbauda
isActivevai jāizmanto suspending funkcijas, kas to dara viņas vietā. - Jāapstrādā pareizi
CancellationException.