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
isActivesustabdž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,
CancellationExceptionnė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.Unconfinedarba su siūlų baseinu, kuris nepalaiko Kooperatyvinio Atšaukimo. NorsCancellationExceptionvis dar bus išmesta, elgsena gali būti nenuspėjama. - Naudojama blokuojanti įvesties/išvesties operacija be įvyniojimo į suspending funkcijas (pavyzdžiui, skaitymas iš
InputStreamcikle bewithContext(Dispatchers.IO)ir suspending metodų). Blokuojanti operacija nepatikrina korutinos būsenos ir nemetaCancellationException.
Kooperatyvinio atšaukimo atveju, korutina turi:
- Naudoti tvarkyklę, palaikančią
Cooperative Cancellation(pavyzdžiui,Dispatchers.Default,Dispatchers.IO,Dispatchers.Main). - Reguliariai tikrinti
isActivearba naudoti suspending funkcijas, kurios tai daro už ją. - Tinkamai tvarkyti
CancellationException.