给出这段代码
fun main() {
val job = Job()
val scope = GlobalScope + job
scope.launch {
println("working!")
delay(1000L)is ms)
println("done!")
// how do i finish the job originally associated with this scope?
}
runBlocking {
job.join()
println("job done")
}
}
我有一个针对我的应用程序的自定义协程范围,并且我正在将一个作业与此范围相关联,原因是我希望从该范围创建的所有新协程成为该作业的子级,如果我取消它,我希望其中的所有内容都被取消。
但是主要工作本身从未完成。任务完成后如何完成主要工作?或失败...
答案 0 :(得分:1)
有几个函数可以等待Job()
对象完成并取消它。您可以从列表中选择一个
job.cancel()
job.join()
job.cancelAndJoin()
只有第一个函数不是suspend
函数,因此您可以从其他每个函数调用它,而不必是suspend
函数
有一个更好的方法-launch{..}
函数已经从调用中返回Job
对象。您可以将代码简化为
val job = GlobalScope.launch { .. }
启动块结束或发生异常失败时,Job
对象将自动完成
答案 1 :(得分:1)
主要工作仅作为父工作,并且永远不会完成。 但是您可以等待所有孩子完成:
runBlocking {
job.children.forEach { it.join() }
println("job done")
}
或者,您应该使用Eugene的解决方案,并调用刚开始的join
的{{1}}方法,而不是主要工作。