SupervisorScope取消其父级

孙达拉维

我在玩android的supervisorScope。该文档说以下内容。

子项的失败不会导致此范围失败,也不会影响其他子项,因此可以实施用于处理其子项失败的自定义策略。有关详细信息,请参见SupervisorJob。范围本身的故障(在块中引发异常或取消)会使范围及其所有子级失效,但不会取消父级作业。

但是请考虑以下代码

viewModelScope.launch {

       launch { someLongJob() }

       supervisorScope {
            launch { jobTwo() }
            launch { jobThree() }
            delay(500)
            throw ArithmeticException()
       }

}

private suspend fun someLongJob() {
    try {
        delay(Long.MAX_VALUE)
    } catch (e: Exception) {
        Log.d(TAG, "Long job cancelled")
    }
}

private suspend fun jobOne() {
    delay(1000)
    throw ArithmeticException()
}

private suspend fun jobTwo() {
    try {
        delay(2000)
    } catch (e: Exception) {
        Log.d(TAG, "Job 2 cancelled")
        throw e
    }
    Log.d(TAG, "Job 2 completed successfully")
}

private suspend fun jobThree() {
    try {
        delay(3000)
    } catch (e: Exception) {
        Log.d(TAG, "Job 3 cancelled")
        throw e
    }
    Log.d(TAG, "Job 3 completed successfully")
}

它产生以下输出

D / TEST:作业2已取消

D / TEST:作业3已取消

D / TEST:取消长期工作

---崩溃开始

我的疑问是,按照粗体显示的文档,supervisorScope不应取消其父项,即使该作用域本身失败意味着不应取消(在父项作业中运行的)长作业。但是输出清楚地表明,在父级中运行的Long作业也被取消。为什么?

马克·托波尼克(Marko Topolnik)

supervisorScope与其他函数一样,是一个函数调用。就您而言,它突然完成,但有例外。既然你没抓住,同样的异常事件引起了launch块突然完成的,导致它被取消。然后,遵循结构化并发的基本原则,取消向内传播并取消了所有子作业。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

ScrollView或其父级无用

来自分类Dev

ImageView溢出其父级

来自分类Dev

从其父级继承的嵌套类

来自分类Dev

将焦点放回其父级?

来自分类Dev

其父级Core的“ this”丢失范围?

来自分类Dev

元素相对于其父级的坐标

来自分类Dev

ScalaFX:如何拉伸ScrollPane以适合其父级

来自分类Dev

数组可能知道其父级吗?

来自分类Dev

对其父级中的每个元素使用insertAfter

来自分类Dev

Android EditText阻止其父级的OnClickListener

来自分类Dev

我如何使TabPane填充其父级?

来自分类Dev

从其父级中隔离子查询

来自分类Dev

将div移到其父级之前

来自分类Dev

固定div的右侧溢出其父级

来自分类Dev

使输入和div的高度等于其父级

来自分类Dev

如何使跨度左对齐其父级

来自分类Dev

如何使下级类调用其父级的方法?

来自分类Dev

ListView没有填充其父级

来自分类Dev

我如何使TabPane填充其父级?

来自分类Dev

捕获拖到其父级之外的ui

来自分类Dev

尝试从其父级的方法访问Fragment的接口

来自分类Dev

从iFrame到其父级访问代码

来自分类Dev

使div高度等于其父级(100%)

来自分类Dev

隐藏内容,直到单击其父级

来自分类Dev

嵌套函数倾斜其父级的返回类型

来自分类Dev

从其父级导航 <router-outlet>

来自分类Dev

子 div 自动调整到其父级

来自分类Dev

CSV,将产品与其父级分组

来自分类Dev

将图像的宽度设置为其父级的父级