Middle+
Оё ҳолатҳои ҳастанд, ки мо наметавонем корутинҳоро бекор кунем?
sobes.tech AI
Ҷавоб аз AI
ҳа, мавжуд.
Бундай ҳолатларга мисоллар:
- Корутин узоқ ҳисоблаш вазифасини бажаради, унинг тўғри текширувларисиз. Корутин фақат
isActive-ни танафусланишда (suspending) текширади. Агар вазифа танафусланмаса (масалан, узоқ цикл ёки математик ҳисоблашлар), у бекор қилиш сўровини кўрмайди. - Бекор қилиш истисносини қайта ишлаш амалга оширилмайди (масалан,
CancellationException-ни ўтказиб юборилмайди). Корутин тугаши мумкин, аммо ота корутин ёки вазифалар бошқарувчиси унинг бекор қилинганини билмайди, ва ресурслар тўғри бўшаши мумкин эмас. Dispatchers.Unconfinedёки некооператив диспетчерлардан фойдаланиш, масалан, ишчи гуруҳга эга бўлмаган диспетчерлар. Гам,CancellationExceptionҳали ҳам ташланади, аммо ҳаракатлар олдиндан айтилмайди.- Блокловчи кириш/чиқиш операцияларини suspending функцияларга ўрамасдан фойдаланиш (масалан,
InputStream-дан ўқиш,withContext(Dispatchers.IO)ва suspending методларисиз). Блокловчи операция корутин ҳолатини текширалмайди ваCancellationException-ни ташламайди.
Кооператив бекор қилиш учун, корутин қуйидагиларни қилиш керак:
Cooperative Cancellation-ни қўллаб-қувватлайдиган диспетчердан фойдаланиш (масалан,Dispatchers.Default,Dispatchers.IO,Dispatchers.Main).- Регуляр равишда
isActive-ни текшириш ёки буни амалга оширадиган suspending функциялардан фойдаланиш. CancellationException-ни тўғри бошқариш.