İptal edilə bilməyən korutini necə həyata keçirərdiniz?
sobes.tech Süni İntellekt
AI-dan cavab
İmtina edilməyən korutina həyata keçirmək üçün NonCancellable kontekstindən istifadə edə bilərsiniz.
import kotlinx.coroutines.*
suspend fun performNonCancellableOperation() {
coroutineScope {
launch {
// Bu korutina ləğv oluna bilər
delay(1000)
println("Bu korutina icra olundu")
}
withContext(NonCancellable) {
// Bu korutina ləğv olunmayacaq, hətta onun valideyn scope-u ləğv olunsa belə
try {
delay(2000) // Uzunmüddətli əməliyyatın simulyasiyası
println("Ləğv edilə bilməyən əməliyyat tamamlandı")
} catch (e: CancellationException) {
// Korutina hələ də CancellationException ala bilər
// bəzi hallarda (məsələn, tətbiqi bağlamaqda),
// amma o, valideynin ləğv edilməsinə reaktiv şəkildə cavab verməyəcək.
println("Ləğv edilə bilməyən əməliyyat ləğv olundu: ${e.message}")
} finally {
// Bu blok hətta ləğv olunsa belə icra olunacaq
println("Ləğv edilə bilməyən əməliyyat tamamlandı (finally)")
}
}
}
}
NonCancellable istifadə etmək, korutina ləğv edildikdən sonra yekun əməliyyatları həyata keçirmək üçün, məsələn, məlumatların saxlanması və ya resursların sərbəst buraxılması üçün faydalıdır.
Əhəmiyyətlidir ki, NonCancellable kontekstindən ləğv etməyə qarşı davamlı edir, amma o, virtual maşını bağlamaqda və ya digər ekstremal hallarda hələ də ləğv edilə bilər. Bundan başqa, withContext(NonCancellable) daxilində çağırılan və özündə ləğv etməyi yoxlayan (məsələn, delay) suspend funksiyası, CancellationException atə bilər. Buna görə, belə vəziyyətləri idarə etmək üçün try-catch-finally istifadə etmək tövsiyə olunur.