DispatchQueue的asyncAndWait方法原理咨询:名称为何看似矛盾?
关于DispatchQueue.asyncAndWait(execute:)的疑问解答
你提到的asyncAndWait(execute:)和sync(execute:)确实容易混淆,但两者存在关键差异,核心在于任务的派发机制和死锁行为:
核心区别
sync(execute:):将任务同步提交到目标队列,当前线程会阻塞,直到任务执行完成。如果当前线程正处于目标队列(比如在主队列调用DispatchQueue.main.sync),会直接触发死锁——因为当前线程在等待任务执行,而任务需要等待队列空闲(当前线程释放队列),形成循环等待。asyncAndWait(execute:):将任务异步提交到目标队列(任务会被加入队列的等待队列中),然后当前线程进入等待状态,直到任务执行完成。即使当前线程处于目标队列(比如主队列调用DispatchQueue.main.asyncAndWait),也不会死锁:因为任务是异步入队,当前线程先释放队列,队列中已有的任务执行完毕后,新提交的任务会被执行,执行完成后再唤醒等待的当前线程。
代码示例对比
// 主队列调用sync会直接死锁,程序崩溃 DispatchQueue.main.sync { print("This line will never run") } // 主队列调用asyncAndWait不会死锁,正常执行 DispatchQueue.main.asyncAndWait { print("This line runs successfully") }
名称的合理性
asyncAndWait的命名并不矛盾:
async指代任务的派发方式:任务是异步提交到目标队列,而非直接在当前线程执行;Wait指代当前线程的行为:提交任务后,当前线程会阻塞等待任务执行完成。
这种设计让它在需要等待任务完成,但又要避免同队列死锁的场景中非常实用。
内容的提问来源于stack exchange,提问作者bobby123uk
相关产品推荐
相关产品推荐

