Middle+
Kas on juhtumeid, kus me ei saa korutinas tühistada?
sobes.tech AI
Vastus AI-lt
jah, olemas.
Selliste juhtude näited:
- Korutina teostab pikka arvutusülesannet ilma regulaarsete tühistamise kontrollideta. Korutina kontrollib
isActiveainult siis, kui ta peatub (suspending). Kui ülesanne ei peatu (näiteks pikk tsükkel või matemaatilised arvutused), siis ta ei märka tühistamissoovi. - Tühistamise erandite töötlemine ei toimu (näiteks,
CancellationExceptionei püüta kinni). Korutina võib lõppeda, kuid vanem korutina või ülesannete haldur ei tea tema tühistamisest ning ressursid võivad jääda õigesti vabastamata. - Mitte-kooperatiivsete schedulereid kasutades, nagu
Dispatchers.Unconfinedvõi thread-pool schedulereid, mis ei toeta Kooperatiivset Tühistamist. KuigiCancellationExceptionvisatakse ikka, võib käitumine olla ettearvamatu. - Blokeerivate sisendi/väljundi operatsioonide kasutamine ilma neid suspending-funktsioonidesse pakkimata (näiteks
InputStreamlugemine tsüklis ilmawithContext(Dispatchers.IO)ja suspending meetoditeta). Blokeeriv operatsioon ei kontrolli korutina olekut ning ei viskaCancellationException.
Kooperatiivse tühistamise jaoks peab:
- Kasutama dispatcherit, mis toetab
Cooperative Cancellation(näiteks,Dispatchers.Default,Dispatchers.IO,Dispatchers.Main). - Regulaarsete kontrollide tegemiseks
isActivevõi kasutama suspending-funktsioone, mis seda teevad. - Õigesti töötlema
CancellationException.