首页 > 解决方案 > 如果直接在协程块内调用,为什么`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继承SupervisorJobfrom scope,而在第二种情况下没有。

我的问题是,如果async是 的扩展功能CoroutineScope,为什么在第二种情况下(崩溃)它不会SupervisorJob以相同的方式继承?

标签: kotlinkotlin-coroutines

解决方案


launch创建一个新作业,并将其传播到CoroutineScope块接收的作业中。在第二个片段中,async作业是作业的子launch作业,并且launch作业在其子作业失败时被取消。

在第一个片段中,该async作业是SupervisorJob您创建的作业的子作业,当其子作业失败时不会取消该作业。在这种launch情况下,工作没有孩子。它只是捕获异常并完成。


推荐阅读