为什么用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)
}
}
如果需要并发执行,可以使用 launch
和 async
等协程构建器。但是,使用 async { ... }
紧跟 .await()
会破坏并发的目的,因为 async
和 await()
调用之间的代码正是 运行 并发的async
的正文:
val deferred = async { computeSomeValue() }
somethingConcurrentWithAsyncBody()
val result = deferred.await()
您可以在有关 composing suspend functions 的文档部分阅读有关如何组织调用以实现并发的更多信息。
我正在学习线程和 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)
}
}
如果需要并发执行,可以使用 launch
和 async
等协程构建器。但是,使用 async { ... }
紧跟 .await()
会破坏并发的目的,因为 async
和 await()
调用之间的代码正是 运行 并发的async
的正文:
val deferred = async { computeSomeValue() }
somethingConcurrentWithAsyncBody()
val result = deferred.await()
您可以在有关 composing suspend functions 的文档部分阅读有关如何组织调用以实现并发的更多信息。