Sobes.tech
Middle+

Оё ҳолатҳои ҳастанд, ки мо наметавонем корутинҳоро бекор кунем?

sobes.tech AI

Ҷавоб аз AI

ҳа, мавжуд.

Бундай ҳолатларга мисоллар:

  • Корутин узоқ ҳисоблаш вазифасини бажаради, унинг тўғри текширувларисиз. Корутин фақат isActive-ни танафусланишда (suspending) текширади. Агар вазифа танафусланмаса (масалан, узоқ цикл ёки математик ҳисоблашлар), у бекор қилиш сўровини кўрмайди.
  • Бекор қилиш истисносини қайта ишлаш амалга оширилмайди (масалан, CancellationException-ни ўтказиб юборилмайди). Корутин тугаши мумкин, аммо ота корутин ёки вазифалар бошқарувчиси унинг бекор қилинганини билмайди, ва ресурслар тўғри бўшаши мумкин эмас.
  • Dispatchers.Unconfined ёки некооператив диспетчерлардан фойдаланиш, масалан, ишчи гуруҳга эга бўлмаган диспетчерлар. Гам, CancellationException ҳали ҳам ташланади, аммо ҳаракатлар олдиндан айтилмайди.
  • Блокловчи кириш/чиқиш операцияларини suspending функцияларга ўрамасдан фойдаланиш (масалан, InputStream-дан ўқиш, withContext(Dispatchers.IO) ва suspending методларисиз). Блокловчи операция корутин ҳолатини текширалмайди ва CancellationException-ни ташламайди.

Кооператив бекор қилиш учун, корутин қуйидагиларни қилиш керак:

  1. Cooperative Cancellation-ни қўллаб-қувватлайдиган диспетчердан фойдаланиш (масалан, Dispatchers.Default, Dispatchers.IO, Dispatchers.Main).
  2. Регуляр равишда isActive-ни текшириш ёки буни амалга оширадиган suspending функциялардан фойдаланиш.
  3. CancellationException-ни тўғри бошқариш.