ドキュメントによると、cancelChildrenはコルーチンの子をキャンセルする必要がありますが、親は影響を受けません(「このジョブ自体の状態は影響を受けません」)。ただし、次のようなコードがある場合
val outer = launch {
try {
launch (coroutineContext) {
try {
// work here
} catch (ex: Exception) {
println("In inner catch")
} finally {
println("In inner finally")
}
}
delay(5000) // so the outer job is running when I cancel it
} catch (ex: CancellationException) {
println("In outer catch")
} finally {
println("In outer finally")
}
}
delay(100) // give it a chance to run
outer.cancelChildren()
次に、次のように表示されます
In inner catch
In inner finally
In outer catch
In outer finally
「外部」ジョブがキャンセルされるのはなぜですか?
これは、outer.cancelを呼び出した場合に得られる動作とまったく同じです(ただし、期待しています)
delay(5000)
外側のコルーチンのあなたはキャンセル可能であるため、の影響を受けouter.cancelChildren()
ます。CancellationException
アウターに見られるものを投げtry
ます。このcancelChildren
関数は外部ジョブをキャンセルしません。これはouter.isCancelled
、呼び出し後に確認することで明らかになります。
場合はdelay
呼び出しがコードから削除され、それが期待される結果を出力します。コルーチンはとにかく子供を待つことに注意してください。遅延は必要ありません。
親コルーチンは、常にすべての子の完了を待ちます。親は、起動するすべての子を明示的に追跡する必要はなく、最後にそれらを待つためにJob.joinを使用する必要もありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加