首页 > 解决方案 > 当工作本身包含另一个工作时,如何等待工作加入?- 科特林

问题描述

这是我们目前拥有的代码的缩小版本。我知道在示例中这似乎微不足道,但在生产中,我们正在向服务器发送一条消息并等待它的响应(这就是它需要异步的原因)。

目标是在最后打印“Hello World”消息,即在 foo() 和 bar() 都完成之后。有谁知道如何实现这一目标?提前致谢!

fun foo() = GlobalScope.launch(Dispatchers.IO) { 
    for (i in 1..5) {
        println("waiting for response from server A $i...")
    }
    bar()
}

fun bar() = GlobalScope.launch(Dispatchers.IO) { 
    for (i in 1..5) {
        println("waiting for response from server B $i...")
    }
}

suspend fun main() {
    val job = GlobalScope.launch(Dispatchers.Default) { foo() }
    job.join()
    println("Hello World")
}

哪个打印

waiting for response from server A 1... 
waiting for response from server A 2...
waiting for response from server A 3...
waiting for response from server A 4...
waiting for response from server A 5...
waiting for response from server B 1...
waiting for response from server B 2...
waiting for response from server B 3...
Hello World
waiting for response from server B 4...
waiting for response from server B 5...

标签: kotlinasynchronouskotlin-coroutines

解决方案


而不是使用GlobalScope.launch(Dispatchers.IO)for 函数foo()bar()您可以withContext(Dispatchers.IO)使用给定的协程上下文调用 which 调用指定的挂起块,挂起直到它完成,并返回结果 -文档

suspend fun main() {
    foo()
    println("Hello World")
}

suspend fun foo() = withContext(Dispatchers.IO) {
    for (i in 1..5) {
        println("waiting for response from server A $i...")
    }
    bar()
}

suspend fun bar() = withContext(Dispatchers.IO) {
    for (i in 1..5) {
        println("waiting for response from server B $i...")
    }
}

推荐阅读