Sobes.tech
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 isActive ainult 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, CancellationException ei 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.Unconfined või thread-pool schedulereid, mis ei toeta Kooperatiivset Tühistamist. Kuigi CancellationException visatakse ikka, võib käitumine olla ettearvamatu.
  • Blokeerivate sisendi/väljundi operatsioonide kasutamine ilma neid suspending-funktsioonidesse pakkimata (näiteks InputStream lugemine tsüklis ilma withContext(Dispatchers.IO) ja suspending meetoditeta). Blokeeriv operatsioon ei kontrolli korutina olekut ning ei viska CancellationException.

Kooperatiivse tühistamise jaoks peab:

  1. Kasutama dispatcherit, mis toetab Cooperative Cancellation (näiteks, Dispatchers.Default, Dispatchers.IO, Dispatchers.Main).
  2. Regulaarsete kontrollide tegemiseks isActive või kasutama suspending-funktsioone, mis seda teevad.
  3. Õigesti töötlema CancellationException.