Sobes.tech
Middle+

Koritlerin iptal edilemeyeceği durumlar var mı?

sobes.tech yapay zeka

AI'dan gelen yanıt

Evet, mevcutturlar.

Böyle durumlara örnekler:

  • Coroutine, düzenli iptal kontrolleri olmadan uzun süren bir hesaplama görevi gerçekleştiriyor. Coroutine, yalnızca suspending sırasında isActive'i kontrol eder. Görev duraklatılmadıkça (örneğin, uzun bir döngü veya matematiksel hesaplamalar) iptal isteğini fark etmez.
  • İptal istisnası yakalama yapılmaz (örneğin, CancellationException yakalanmaz). Coroutine sona erebilir, ancak ebeveyn coroutine veya görev yöneticisi iptalden haberdar olmaz ve kaynaklar düzgün şekilde serbest bırakılmayabilir.
  • Dispatchers.Unconfined veya kooperatif olmayan thread havuzunu kullanan planlayıcılar gibi kooperatif olmayan planlayıcıların kullanımı. CancellationException yine de atılsa da, davranış tahmin edilemez olabilir.
  • Bloklayıcı giriş/çıkış işlemlerinin, withContext(Dispatchers.IO) ve suspending fonksiyonlar kullanılmadan, döngü içinde InputStream okuma gibi, sarmalanmadan kullanılması. Bloklayıcı işlem, coroutine durumunu kontrol etmez ve CancellationException atmaz.

Kooperatif iptal için, coroutine şu şartları sağlamalıdır:

  1. Cooperative Cancellation destekleyen bir dispatcher kullanmalı (örneğin, Dispatchers.Default, Dispatchers.IO, Dispatchers.Main).
  2. Düzenli olarak isActive kontrol etmeli veya bunu yapan suspending fonksiyonlar kullanmalı.
  3. CancellationException'ı doğru şekilde işlemesi gerekir.