Middle+
Koruletin ləğv edilə bilməyəcəyi hallar varmı?
sobes.tech Süni İntellekt
AI-dan cavab
Bəli, mövcuddur.
Belə halların nümunələri:
- Korutina uzun müddətli hesablamalı və ya iş görən və müntəzəm yoxlamalar etməyən bir tapşırıq yerinə yetirir. Korutina yalnız
suspendingzamanıisActive-i yoxlayır. Əgər tapşırıq dayandırılmırsa (məsələn, uzun dövr və ya riyazi hesablamalar), o, dayandırma sorğusunu görməyəcək. - Dayandırma istisnasının işlənməsi baş vermir (məsələn,
CancellationExceptiontutulmur). Korutina sona çatdıra bilər, lakin valideyn korutina və ya tapşırıq meneceri onun dayandırıldığını bilməyəcək və resurslar düzgün sərbəst buraxılmaya bilər. Dispatchers.Unconfinedvə ya kooperativ olmayan ip havuzuna malik planlayıcılar kimi kooperativ olmayan planlayıcılardan istifadə.CancellationExceptionhələ də atılsa da, davranış qeyri-müəyyən ola bilər.- Bloklayıcı giriş/çıxış əməliyyatlarının suspending funksiyalarına daxil edilmədən istifadə edilməsi (məsələn,
InputStream-dən oxuma,withContext(Dispatchers.IO)və suspending metodlar olmadan). Bloklayıcı əməliyyat korutina vəziyyətini yoxlamır vəCancellationExceptionatmaz.
Kooperativ dayandırma üçün, korutina aşağıdakıları etməlidir:
Cooperative Cancellation-ı dəstəkləyən dispatcher istifadə etməlidir (məsələn,Dispatchers.Default,Dispatchers.IO,Dispatchers.Main).- Mütəmadi olaraq
isActive-i yoxlamalı və ya bunu edən suspending funksiyalar istifadə etməlidir. CancellationException-u düzgün idarə etməlidir.