为何未await Swift的async let任务会抛出CancellationError?
为什么不await async let创建的任务会被取消?
这本质是Swift并发模型里父子任务的生命周期绑定规则在起作用:
- 用
async let声明任务时,会创建一个依附于当前父任务的子任务。这个子任务的存活完全依赖父任务——只要父任务执行完成(比如当前的同步代码段跑完、函数返回),Swift并发运行时会自动取消所有还没完成的子任务,这就是你看到CancellationError的原因。 - 而用
await ViewModel().test()时,父任务会主动暂停,等待这个异步任务执行完毕后再继续。父任务不会提前结束,子任务自然能正常跑完,不会被取消。
结合你的场景来看:主线程的父任务调用async let后,没做await就继续执行后续逻辑,很快父任务就走完了,这时候后台Actor里的test()还没执行完成,就被并发运行时强制取消了。而使用await时,父任务会一直等待test()执行完毕,所以不会触发取消逻辑。
内容的提问来源于stack exchange,提问作者VishnuPrabhu
相关产品推荐
相关产品推荐

