Kotlin 异步作业取消导致父级取消

Kotlin 异步作业取消导致父级取消,kotlin,kotlin-coroutines,Kotlin,Kotlin Coroutines,我尝试运行两个异步作业 单击时有一个按钮,将取消其中一个作业。但我注意到,当我这样做的时候,其他的工作也会被取消 发生了什么事 class SplashFragment : BaseFragment(R.layout.fragment_splash), CoroutineScope by MainScope() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCrea

我尝试运行两个异步作业

单击时有一个按钮,将取消其中一个作业。但我注意到,当我这样做的时候,其他的工作也会被取消

发生了什么事

class SplashFragment : BaseFragment(R.layout.fragment_splash), CoroutineScope by MainScope() {

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    launch {
        val countdown = async { countDown() }
        val ipAndMaintain = async { checkIPAndMaintain() }

        btnSkip.onClick {
            countdown.cancel() // cancel countdown
            btnSkip.isVisible = false
            if (!ipAndMaintain.isCompleted) {
                showLoadingDialog()
            }
        }
        countdown.await()
        startOtherPage(ipAndMaintain.await())
    }
}

private suspend fun countDown() {
    var time = 3
    while (time >= 0) {
        btnSkip.text = getString(R.string.skip, time)
        delay(1000)
        yield()
        time--
    }
}

private suspend fun checkIPAndMaintain(): Int {
    delay(2000)
    return 1
}

}

当您对已取消的
延迟的
调用
wait
时,它会引发异常。如果您没有捕获它,那么它将被传播到父协同程序,父协同程序将取消其所有子项。用
try catch
块包装您的
倒计时.wait()
指令,您将看到另一个协同程序继续。这就是结构化并发的效果


您可以阅读有关该主题的内容。

当您在取消的
延迟的
上调用
等待
时,它会引发异常。如果您没有捕获它,那么它将被传播到父协同程序,父协同程序将取消其所有子项。用
try catch
块包装您的
倒计时.wait()
指令,您将看到另一个协同程序继续。这就是结构化并发的效果


您可以阅读有关该主题的内容。

结构化并发的另一个影响是,如果
async{countDown()}
失败,它也会导致父级及其所有子级被取消,无论您是否从
wait()
@MarkoTopolnik()捕获异常。谢谢。结构化并发的另一个影响是,如果
async{countDown()}
失败,它还将导致父级及其所有子级被取消,无论您是否从
wait()
捕获异常@MarkoTopolnik获得它。谢谢