根据文档,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中看到的trycancelChildren函数不会取消外部作业,可以通过在调用后检查outer.isCancelled来使外部作业显而易见。

如果从代码中删除了delay调用,它将打印预期结果。注意协程等待他们的 child anyway,没有必要延迟:

关于kotlin - cancelChildren如何在Kotlin Coroutines工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47908590/

10-10 01:45