首页 > 解决方案 > async/await 概念中 async、detach 和 asyncDetached 函数的区别

问题描述

如果我理解正确,async, detach and asyncDetached两者都会创建一个任务(并发单元),简单来说,它允许我们在其中执行await方法。async和我能找到的唯一区别是从被调用上下文(至少是优先级)detach继承属性的区别。

我对我对它们之间的差异的误解毫无疑问。但不幸的是,即使在 WWDC 视频中也找不到正确的解释。

标签: iosswiftasync-awaitconcurrency

解决方案


名称asyncdetached并且asyncDetach随着时间的推移而演变。我们现在不调用async(或detached)来启动非结构化任务,而只是Task(priority:operation:). 正如Swift 编程语言:并发:非结构化并发所说:

非结构化并发

除了前几节中描述的结构化并发方法外,Swift 还支持非结构化并发。与属于任务组的任务不同,非结构化任务没有父任务。您可以完全灵活地以程序需要的任何方式管理非结构化任务,但您也要对它们的正确性负全部责任。要创建在当前参与者上运行的非结构化任务,请调用Task.init(priority:operation:)初始化程序。要创建不属于当前参与者的非结构化任务,更具体地称为分离任务,请调用Task.detached(priority:operation:)类方法。这两个操作都返回一个任务句柄,让您可以与任务交互——例如,等待其结果或取消它。

SE-0304说:

分离任务是独立于创建它的上下文的非结构化任务,这意味着它不继承优先级、任务本地值或参与者上下文。

分离任务也在 WWDC 2021 视频探索 Swift 中的结构化并发的后半部分进行了广泛讨论。


推荐阅读