Sobes.tech
Middle+

Կան դեպքեր, երբ չենք կարող չեղարկել կորուտիները?

sobes.tech AI

Պատասխան AI-ից

այո, գոյություն ունեն.

այդպիսի դեպքերի օրինակներ՝

  • Կորուտին իրականացնում է երկար հաշվարկային աշխատանք առանց կանոնավոր չեղարկման ստուգումների։ Կորուտին միայն isActive-ին ստուգում է ընդհատման ժամանակ (suspending)։ Եթե աշխատանքը չի ընդհատվում (օրինակ՝ երկար ցիկլ կամ մաթեմատիկական հաշվարկներ), այն չի նկատի չեղարկման հարցումը։
  • Չեղարկման արտահայտությունների մշակումը տեղի չի ունենում (օրինակ՝ CancellationException-ը չի բռնվում)։ Կորուտին կարող է ավարտվել, բայց ծնողական կորուտին կամ առաջադրանքի կառավարիչը չգիտեն դրա մասին, և ռեսուրսները կարող են ճիշտ չազատվել։
  • Օգտագործում է ոչ-կոոպերատիվ dispatcher-ներ, ինչպիսիք են Dispatchers.Unconfined կամ thread pool dispatcher-ներ, որոնք չեն աջակցում Կոոպերատիվ Չեղարկմանը։ Թեև CancellationException-ը դեռ կթողնվի, վարքագիծը կարող է լինել անկանխատեսելի։
  • Օգտագործում է բլոկավոր մուտք/ելք գործողություններ առանց դրանք suspending ֆունկցիաների մեջ գցելու (օրինակ՝ կարդալ InputStream-ից ցիկլում առանց withContext(Dispatchers.IO) և suspending մեթոդների)։ Բլոկավոր գործողությունը չի ստուգում կորուտինի վիճակը և չի նետում CancellationException։

Կոոպերատիվ չեղարկման համար, կորուտին պետք է:

  1. Օգտագործել dispatcher, որը աջակցում է Cooperative Cancellation (օրինակ՝ Dispatchers.Default, Dispatchers.IO, Dispatchers.Main
  2. Կանոնավոր կերպով ստուգել isActive-ը կամ օգտագործել suspending ֆունկցիաներ, որոնք դա անում են նրա համար։
  3. Դուրս գալ CancellationException-ից ճիշտ կերպով։