首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么使用withContext()而不是异步等待,协程的目标不是为了实现并发吗?

为什么使用withContext()而不是异步等待,协程的目标不是为了实现并发吗?
EN

Stack Overflow用户
提问于 2021-05-24 06:38:38
回答 1查看 309关注 0票数 1

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-24 06:58:43

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

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

代码语言:javascript
复制
val result = someComputation()
withContext(Dispatchers.Main) {
    updateUI(result)
}

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

代码语言:javascript
复制
scope.launch(Dispatchers.Default) {
    val result = someComputation()
    withContext(Dispatchers.Main) {
        updateUI(result)
    }
}

如果你需要执行并发的东西,你可以使用像launchasync这样的协程构建器。然而,紧接着使用async { ... }.await()就违背了并发的目的,因为asyncawait()调用之间的代码正是将与async的主体并发运行的代码:

代码语言:javascript
复制
val deferred = async { computeSomeValue() }
somethingConcurrentWithAsyncBody()
val result = deferred.await()

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67665004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档