首页 > 解决方案 > 如何并行运行多个 Kotlin 协程并等待它们完成后再继续

问题描述

我需要并行运行 2 个协程并等待它们完成后再继续。下面的代码有效,但它使用GlobalScope的不是最好的方法。

有没有更好的办法?

fun getInfo(onSuccess: () -> Unit, onError: () -> Unit) {
        GlobalScope.launch(Dispatchers.IO) {
            try {
                coroutineScope {
                    launch { getOne() }
                    launch { getTwo() }
                }
                onSuccess.invoke()
            } catch (e: Throwable) {
                onError.invoke()
            }
        }
    }

标签: kotlinkotlin-coroutines

解决方案


你可以使用任何你喜欢的范围。这不影响你的问题。不鼓励使用 GlobalScope,因为它不封装您的任务。

实际使用哪个范围来启动您的协程将完全取决于您正在做什么的上下文以及您正在使用的封装策略。

要一次启动多个协程并等待所有协程,请使用asyncand await()awaitAll()如果您只需要在继续之前完成所有这些,您可以使用它们的列表。

您使用 IO 调度程序来运行您的回调似乎很奇怪,但我会留下它,因为我对您的代码的上下文视而不见。

fun getInfo(onSuccess: () -> Unit, onError: () -> Unit) {
        GlobalScope.launch(Dispatchers.IO) {
            try {
                coroutineScope {
                    listOf(
                        async { getOne() }
                        async { getTwo() }
                    }.awaitAll()
                }
                onSuccess.invoke()
            } catch (e: Throwable) {
                onError.invoke()
            }
        }
    }

推荐阅读