- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
根据文档,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()
的影响。它抛出在外部 try
中看到的 CancellationException
。 cancelChildren
函数不会取消外部作业,这可以通过在调用后检查 outer.isCancelled
来明显看出。
如果从代码中删除了 delay
调用,它会打印出预期的结果。请注意协程等待他们的 child anyway , 延迟是没有必要的:
A parent coroutine always waits for completion of all its children. Parent does not have to explicitly track all the children it launches and it does not have to use Job.join to wait for them at the end.
关于kotlin - 在 Kotlin 协程中 cancelChildren 应该如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47908590/
根据文档,cancelChildren 应该取消协程的子进程,但不影响父进程(“这项工作本身的状态不受影响。”)但是如果我有这样的代码 val outer = launch { try
我是一名优秀的程序员,十分优秀!