Sobes.tech
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 suspending zamanı 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, CancellationException tutulmur). 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.Unconfined və ya kooperativ olmayan ip havuzuna malik planlayıcılar kimi kooperativ olmayan planlayıcılardan istifadə. CancellationException hə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ə CancellationException atmaz.

Kooperativ dayandırma üçün, korutina aşağıdakıları etməlidir:

  1. Cooperative Cancellation-ı dəstəkləyən dispatcher istifadə etməlidir (məsələn, Dispatchers.Default, Dispatchers.IO, Dispatchers.Main).
  2. Mütəmadi olaraq isActive-i yoxlamalı və ya bunu edən suspending funksiyalar istifadə etməlidir.
  3. CancellationException-u düzgün idarə etməlidir.