Sobes.tech
Middle+

Ar yra atvejų, kai negalime atšaukti korutinas?

sobes.tech AI

Atsakymas iš AI

taip, egzistuoja.

Pavyzdžiai tokių atvejų:

  • Korutina atlieka ilgą skaičiavimų užduotį be reguliarių atšaukimo patikrinimų. Korutina tik tikrina isActive sustabdžius (suspending). Jei užduotis nėra sustabdoma (pavyzdžiui, ilgas ciklas ar matematiniai skaičiavimai), ji nepastebės atšaukimo užklausos.
  • Atšaukimo išimčių apdorojimas nevyksta (pavyzdžiui, CancellationException nėra gaudomas). Korutina gali būti baigta, bet tėvinė korutina ar užduočių tvarkytojas nežinos apie jos atšaukimą, ir ištekliai gali būti netinkamai atlaisvinti.
  • Naudojami nekooperatyvūs tvarkyklės, tokios kaip Dispatchers.Unconfined arba su siūlų baseinu, kuris nepalaiko Kooperatyvinio Atšaukimo. Nors CancellationException vis dar bus išmesta, elgsena gali būti nenuspėjama.
  • Naudojama blokuojanti įvesties/išvesties operacija be įvyniojimo į suspending funkcijas (pavyzdžiui, skaitymas iš InputStream cikle be withContext(Dispatchers.IO) ir suspending metodų). Blokuojanti operacija nepatikrina korutinos būsenos ir nemeta CancellationException.

Kooperatyvinio atšaukimo atveju, korutina turi:

  1. Naudoti tvarkyklę, palaikančią Cooperative Cancellation (pavyzdžiui, Dispatchers.Default, Dispatchers.IO, Dispatchers.Main).
  2. Reguliariai tikrinti isActive arba naudoti suspending funkcijas, kurios tai daro už ją.
  3. Tinkamai tvarkyti CancellationException.