kotlin - 如果直接在协程块内调用,为什么`async`不会继承SupervisorJob?
问题描述
鉴于以下代码片段:
片段 [1]
val job = SupervisorJob()
val scope = CoroutineScope(Dispatchers.IO + job)
scope.launch {
try {
scope.async {
throw RuntimeException("Oops!")
}.await()
} catch(e: Exception) {
// Handle exception
}
}
和片段 [2]
val job = SupervisorJob()
val scope = CoroutineScope(Dispatchers.IO + job)
scope.launch {
try {
async {
throw RuntimeException("Oops!")
}.await()
} catch(e: Exception) {
// Handle exception
}
}
第一个有效,第二个片段崩溃。一般的解释是,在第一种情况下,async
继承SupervisorJob
from scope
,而在第二种情况下没有。
我的问题是,如果async
是 的扩展功能CoroutineScope
,为什么在第二种情况下(崩溃)它不会SupervisorJob
以相同的方式继承?
解决方案
launch
创建一个新作业,并将其传播到CoroutineScope
块接收的作业中。在第二个片段中,async
作业是作业的子launch
作业,并且launch
作业在其子作业失败时被取消。
在第一个片段中,该async
作业是SupervisorJob
您创建的作业的子作业,当其子作业失败时不会取消该作业。在这种launch
情况下,工作没有孩子。它只是捕获异常并完成。
推荐阅读
- r - 在 rmanovab(WRS2 R 包)中使用函数 head() 的原因是什么?
- python-3.x - 使用 numpy.percentile 在数据框中的不同 id 上取百分位数
- android - 将数据传递到 infowindowclick 谷歌地图
- haskell - Haskell 中的非法多态或限定类型
- python - Python中的Zelle图形:如何分别移动两个对象
- c - 如何连续列出/打印数组中的多个值?
- firebase - 用于不等式检查的 Firebase 数据建模
- firebase - Firebase:删除帐户后允许删除用户内容
- javascript - 使用 javascript (Bookly WP 插件) 选择一个下拉值
- c# - C#应用程序从php接收数据