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