kotlin - 当工作本身包含另一个工作时,如何等待工作加入?- 科特林
问题描述
这是我们目前拥有的代码的缩小版本。我知道在示例中这似乎微不足道,但在生产中,我们正在向服务器发送一条消息并等待它的响应(这就是它需要异步的原因)。
目标是在最后打印“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...
解决方案
而不是使用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...")
}
}
推荐阅读
- r - 选择行意味着大于数据框的整体平均值的行
- python - Selenium webdriver (python) 在一台计算机上运行,但在另一台计算机上运行:selenium.common.exceptions.SessionNotCreatedException
- excel - 使用带有日期范围的 GETPIVOTDATA
- python - 打印时去除多余的字符
- python - conda 环境中缺少 /bin 文件夹
- python - 如果元素在方括号中,如何使用 pydicom 从 .dcm 文件中获取 dicom 元素
- java - 使用 Gson 将对象转换为 JSON 字符串时的频繁 GC
- javascript - 如何链接到handleSubmit formik中的下一页url?
- reactjs - 如何将 thunk 动作转换为 saga 动作
- shell - 使用 jq 合并两个包含公共数组的 Apache Avro 模式