簡體   English   中英

協程工作永遠不會完成

[英]Coroutine job never completing

鑒於這段代碼


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

我有一個針對我的應用程序的自定義協程范圍,並且我正在將一個工作與此范圍相關聯,原因是我希望從該范圍創建的所有新協程成為該工作的孩子,如果我取消它的話希望取消其中的所有內容。

但是主要工作本身從未完成。 任務完成后如何完成主要工作? 還是失敗了

有幾個函數可以等待Job()對象完成並取消它。 您可以從列表中選擇一個

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

只有第一個函數不是suspend函數,因此您可以從其他每個函數調用它,而不必是suspend函數

有一種更好的方法launch{..}函數已經從調用中返回Job對象。 您可以簡化代碼來說明

val job = GlobalScope.launch { .. }

啟動塊結束或出現異常失敗時,該Job對象將自動完成

主要工作僅作為父工作,並且永遠不會完成。 但是您可以等待所有孩子完成:

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

另外,您應該使用Eugene的解決方案,並調用剛啟動的Jobjoin方法,而不是主job。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM