根据文档,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
为什么“外部”工作被取消?
如果我调用external.cancel(这是我期望的),这与我得到的行为完全相同。
最佳答案
您在外部协程中的delay(5000)
是可取消的,因此受outer.cancelChildren()
影响。它抛出在外部CancellationException
中看到的try
。 cancelChildren
函数不会取消外部作业,可以通过在调用后检查outer.isCancelled
来使外部作业显而易见。
如果从代码中删除了delay
调用,它将打印预期结果。注意协程等待他们的 child anyway,没有必要延迟:
关于kotlin - cancelChildren如何在Kotlin Coroutines工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47908590/