gpt4 book ai didi

kotlin - 在 Kotlin 协程中 cancelChildren 应该如何工作?

转载 作者:行者123 更新时间:2023-12-02 12:54:53 25 4
gpt4 key购买 nike

根据文档,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 中看到的 CancellationExceptioncancelChildren 函数不会取消外部作业,这可以通过在调用后检查 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com