Cancellation and Timeouts
14148 ワード
Kotlin公式文書
Cancelling coroutine executioncoroutineは不要です.ジョブをコミットしてからキャンセルしてください. Cancellation is cooperativeすべてのsuspend関数はキャンセル可能であり、CancellationExceptionを放出します. ただし、coroutineは 上記の問題を解決するために、まず、ループ内の各ループにyield()を呼び出す方法がある. ループ条件文には、 closing resources with finallycoroutine cancelはCancellationExceptionで行います. try/finally定義を使用してcancelを完了したタスクを以下に示します.(もちろん、これはcatchにもつながります.) functionはまた、リソース 特別な場合、キャンセルされたcoroutineでsuspend関数を使用する必要がある場合があります. この場合 try/catchは、終了動作の処理に用いることができる. または withTimeout時 したがって、単独で処理しなければブロック内でのコードの実行は保証されない. finallyは、リソースの参照を提供し、
Cancelling coroutine execution
val job = launch {
repeat(1000) { i ->
println("job: I'm sleeping $i ...")
delay(500L)
}
}
delay(1300L) // delay a bit
println("main: I'm tired of waiting!")
job.cancel() // cancels the job
job.join() // waits for job's completion
println("main: Now I can quit.")
job.cancelAndJoin()
job.cancel()
およびjob.join()
は同時に完了することができる.working in a computation
であり、キャンセルチェックを行わないとキャンセルされません.val startTime = System.currentTimeMillis()
val job = launch(Dispatchers.Default) {
var nextPrintTime = startTime
var i = 0
while (i < 5) { // computation loop, just wastes CPU
// print a message twice a second
if (System.currentTimeMillis() >= nextPrintTime) {
println("job: I'm sleeping ${i++} ...")
nextPrintTime += 500L
}
}
}
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.")
Making computation code cancellableyield()
coroutineがキャンセルまたは完了した場合、CancellationExceptionを放出します.isActive
を確認する方法があります.use
functionを閉じるために使用することができる.(詳細)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.")
Run non-cancellable blockNonCancellable
coroutine contextを使用します.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")
}
Timeoutcancel()
を使用する代わりにwithTimeout()
を使用してTimeoutCancellationException
タイムアウトをトリガーすることもできる.withTimeoutNull()
を使用して、exceptionの代わりにnullを使用することもできます.val result = withTimeoutOrNull(1300L) {
repeat(1000) { i ->
println("I'm sleeping $i ...")
delay(500L)
}
"Done" // will get cancelled before it produces this result
}
println("Result is $result")
Asynchronous timeout and resourcestimeout 이벤트
およびblock 내부의 코드
非同期運転.close()
が以下に示すことを保証します.runBlocking {
repeat(100_000) { // Launch 100K coroutines
launch {
var resource: Resource? = null // Not acquired yet
try {
withTimeout(60) { // Timeout of 60 ms
delay(50) // Delay for 50 ms
resource = Resource() // Store a resource to the variable if acquired
}
// We can do something else with the resource here
} finally {
resource?.close() // Release the resource if it was acquired
}
}
}
}
// Outside of runBlocking all coroutines have completed
println(acquired) // Print the number of resources still acquired
Reference
この問題について(Cancellation and Timeouts), 我々は、より多くの情報をここで見つけました https://velog.io/@cmplxn/Cancellation-and-Timeoutsテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol