协同工作永远不会完成

问题描述 投票:0回答:2

鉴于这段代码


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")
    }
}

我的应用程序有一个自定义协同程序范围,我正在将这个作用与这个作用域相关联,因为我希望从这个作用域创建的所有新协程都是这个作业的子代,如果我取消它我希望其中的所有内容都被取消。

但主要工作本身永远不会完成。完成任务后如何完成主要工作?或者失败了......

kotlin kotlinx.coroutines
2个回答
1
投票

有几个函数可以等待Job()对象完成并取消它。您可以从列表中选择一个

job.cancel()
job.join()
job.cancelAndJoin()

只有第一个函数不是suspend函数,所以你可以从其他所有函数调用它,不一定是suspend函数

有一种更好的方法 - launch{..}函数已经从调用中返回Job对象。您可以简化代码来说明

val job = GlobalScope.launch { .. }

当启动块结束或因异常而失败时,Job对象将自动完成


1
投票

主要工作仅作为父工作,永远不会完成。但你可以等所有孩子完成:

runBlocking {
    job.children.forEach { it.join() }
    println("job done")
}

或者你应该选择Eugene的解决方案并调用你刚刚开始的joinJob方法,而不是主要的工作。

© www.soinside.com 2019 - 2024. All rights reserved.