Sobes.tech
Middle+

Kuidas te implementiksite mittetühistatavat korutini?

sobes.tech AI

Vastus AI-lt

Demonstraator, kuidas kasutada NonCancellable konteksti mittetühistatavate korutinate teostamiseks.

import kotlinx.coroutines.*

suspend fun performNonCancellableOperation() {
    coroutineScope {
        launch {
            // See korutina võib olla tühistatud
            delay(1000)
            println("See korutina on täidetud")
        }

        withContext(NonCancellable) {
            // See korutina ei saa tühistada, isegi kui selle vanem scope tühistatakse
            try {
                delay(2000) // Pikaajalise operatsiooni imitatsioon
                println("Mittetühistatav operatsioon on täidetud")
            } catch (e: CancellationException) {
                // Korutina võib ikka saada CancellationException
                // teatud juhtudel (näiteks rakenduse sulgemisel),
                // kuid see ei tühistata reaktsiooniliselt vanemast.
                println("Mittetühistatava operatsiooni tühistamine: ${e.message}")
            } finally {
                // See plokk täidetakse isegi tühistamise korral
                println("Mittetühistatav operatsioon on lõpetatud (finally)")
            }
        }
    }
}

NonCancellable kasutamine on kasulik lõpetavate operatsioonide, nagu andmete salvestamine või ressursside vabastamine, teostamiseks, kui korutina on tühistatud.

Oluline on meeles pidada, et NonCancellable muudab korutina tühistamatuks kontekstist, kuid see võib siiski olla tühistatud virtuaalse masina sulgemise või muude äärmuslike juhtumite korral. Samuti, kui withContext(NonCancellable) sees kutsutakse peatamise funktsioon, mis ise kontrollib tühistamist (näiteks delay), võib see visata CancellationException. Seetõttu on soovitatav kasutada try-catch-finally selliste olukordade käsitlemiseks.