为什么用withContext() vs Async-await,协程的目的不就是实现并发吗?

Why use withContext() vs Async-await, isn't the goal of coroutines to achieve concurrency?

我正在学习线程和 kotlin 协程以同时加载我的 UI 和存储库,然后使用“withContext()”作为异步等待的替代方法。 如果我正确理解“withContext()”并且它会一个接一个地执行任务以等待前一个任务完成,那为什么还要使用它呢?我还缺少另一个概念吗?

withContext 是一个挂起函数,允许在不同的协程上下文中执行一段特定的代码。当您想在不同的调度程序中执行某些操作时,它特别有用。

例如,您可以在具有多个线程的默认调度程序中包含一些代码 运行,然后使用该代码生成的值来更新 UI 中的一些 UI线。在那种情况下,您不是在寻找并发性,默认调度程序的计算必须在更新 UI 之前发生,因为您需要结果:

val result = someComputation()
withContext(Dispatchers.Main) {
    updateUI(result)
}

当然,即使UI的计算和更新不是并发的,它们的顺序也可以和其他代码段并发:

scope.launch(Dispatchers.Default) {
    val result = someComputation()
    withContext(Dispatchers.Main) {
        updateUI(result)
    }
}

如果需要并发执行,可以使用 launchasync 等协程构建器。但是,使用 async { ... } 紧跟 .await() 会破坏并发的目的,因为 asyncawait() 调用之间的代码正是 运行 并发的async 的正文:

val deferred = async { computeSomeValue() }
somethingConcurrentWithAsyncBody()
val result = deferred.await()

您可以在有关 composing suspend functions 的文档部分阅读有关如何组织调用以实现并发的更多信息。