You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift中如何不等待结果异步调用async函数,实现GCD的DispatchQueue.async效果

现象原因解释

Swift 并发模型中,Task 初始化后会立即同步执行闭包内的代码,直到遇到第一个实际会触发挂起的await点才会让出当前线程的执行权。你定义的first虽然标记了async,但内部没有任何挂起操作,所以Task { await first() }会同步执行完first的全部逻辑,才会继续往下调用second,最终输出顺序就是first在前、second在后。

实现方案

要实现类似GCD DispatchQueue.current.async { first() } 提交后立即执行后续代码的效果,有两种常用实现方式:

  • 主动让出执行权
    在Task闭包最开始调用await Task.yield(),主动触发挂起,让出当前线程的执行权,先执行后续的second调用:
func main() {
   Task {
      await Task.yield()
      await first()
   }
   second()
}
  • 使用分离任务(Detached Task)
    如果不需要继承当前的执行上下文(比如当前的Actor优先级、执行队列等),可以用分离任务实现完全的异步提交:
func main() {
   Task.detached {
      await first()
   }
   second()
}

两种修改方式运行后,输出顺序都会符合预期:

second
first

内容的提问来源于stack exchange,提问作者Vladislav Brylinskiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:36:04