![](/img/trans.png)
[英]Coroutine job completing even after cancellation from external function
[英]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的解決方案,並調用剛啟動的Job
的join
方法,而不是主job。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.