【问题标题】:Coroutine job never completing协程工作永远不会完成
【发布时间】:2019-02-18 18:59:48
【问题描述】:

鉴于这段代码


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


    【解决方案1】:

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

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

    或者,您应该使用 Eugene 的解决方案并调用您刚刚启动的 Jobjoin 方法,而不是主要工作。

    【讨论】:

    • “主要工作仅作为父工作,永远不会完成” - 能否请您链接相应的文档?我试图理解这一点...... :)
    【解决方案2】:

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

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

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

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

    val job = GlobalScope.launch { .. }
    

    Job 对象将在启动块结束或异常失败时自动完成

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多