finally로 리소스 닫기
취소 가능한 일시 중단 기능은 취소하여 중단할 수 있습니다.
취소 예외, 평소와 같이 처리할 수 있습니다.
예를 들어 시도 { … } 그리고 마지막으로 { … } 구문 또는 Kotlin의 사용 이 함수는 코루틴이 중단되면 정상 종료를 수행합니다.
import kotlinx.coroutines.*
fun main() = runBlocking {
val job = launch {
try {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
} finally {
println("job: I'm running finally")
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!
")
job.cancelAndJoin() // cancels the job and waits for its completion
println("main: Now I can quit.")
}
완전한 코드는 여기에서 찾을 수 있습니다
연결하다수업 취소 및 가입 전체 종료 프로세스가 완료될 때까지 기다리십시오. 따라서 위의 예는 다음과 같은 결과를 생성합니다.
job: I'm sleeping 0 ...
job: I'm sleeping 1 ...
job: I'm sleeping 2 ...
main: I'm tired of waiting!
job: I'm running finally
main: Now I can quit.
이 문서는 공식 코루틴 문서를 번역한 것입니다.
원래의: 중단 및 시간 초과 – final로 리소스 닫기
원본 텍스트의 최종 편집: 2022년 6월 27일
실행 취소할 수 없는 블록 실행
이전 예제에서 finally 블록 내에서 suspend 함수를 사용하려고 하면 해당 코드를 실행하는 코루틴이 중단되기 때문입니다.
취소 예외발생*1. 정상적으로 작동하는 리소스를 닫는 작업(파일 닫기, 작업 중단 또는 통신 채널 닫기)은 일반적으로 비차단 작업이며 일시 중단 기능을 포함하지 않으므로 일반적으로 문제가 되지 않습니다.
그러나 거의 중단되지 않는 코루틴을 일시 중단해야 하는 경우 다음을 수행하십시오. 맥락과 함께기능하다 취소 불가 컨텍스트를 전달하여 사용 withContext(취소 불가) { … } 사용할 수 있습니다.
val job = launch {
try {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
} finally {
withContext(NonCancellable) {
println("job: I'm running finally")
delay(1000L)
println("job: And I've just delayed for 1 sec because I'm non-cancellable")
}
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!
")
job.cancelAndJoin() // cancels the job and waits for its completion
println("main: Now I can quit.")
완전한 코드는 여기에서 찾을 수 있습니다
다음 내용은 독자의 이해를 돕기 위해 번역자가 추가한 내용입니다.
*하나. 이전 예제에서 finally 내부 지연을 사용하도록 코드가 변경되었습니다.
fun main() = runBlocking {
val job = launch {
try {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
} catch (e: Exception) {
println(e)
} finally {
delay(1000L)
println("job: I'm running finally")
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!
")
job.cancelAndJoin() // cancels the job and waits for its completion
println("main: Now I can quit.")
}
위의 코드를 실행하면 다음과 같은 결과가 생성됩니다.
반전 예외가 발생하는 것을 확인할 수 있습니다.
job: I'm sleeping 0 ...
job: I'm sleeping 1 ...
job: I'm sleeping 2 ...
main: I'm tired of waiting!
kotlinx.coroutines.JobCancellationException: StandaloneCoroutine was cancelled; job=StandaloneCoroutine{Cancelling}@9660f4e
main: Now I can quit.
이 문서는 공식 코루틴 문서를 번역한 것입니다.
원래의: 중단 및 시간 초과 – 중단 불가능한 블록 실행
원본 텍스트의 최종 편집: 2022년 6월 27일