DispatchAsync与带async闭包的DispatchSync的区别及改写影响
两种代码的核心差异
下面从三个关键维度拆解两者的区别:
1. 线程阻塞行为
- 原代码(
DispatchSync):调用后会立刻阻塞当前线程,必须等传入的asynclambda里的逻辑全部执行完毕(包括await FooAsync()的异步操作完成),当前线程才会继续执行后续代码。如果是在UI线程调用这段代码,会直接导致界面卡顿无响应。 - 改写后(
DispatchAsync):调用后不会阻塞当前线程,当前线程会立刻返回去执行后续代码,lambda里的逻辑会在全局队列的线程上异步执行,和当前线程的任务并行处理。
2. 异常处理逻辑
- 原代码中,
asynclambda会返回一个Task,DispatchSync会等待这个Task完成,若FooAsync或后续逻辑抛出异常,这个异常会被封装在Task中,外层可以通过try/catch正常捕获。 - 改写后,
DispatchAsync接收的是Action类型的委托,async Action本质是async void,如果FooAsync抛出异常,这个异常会直接抛到线程池,无法被外层的try/catch捕获,严重时会导致程序崩溃。
3. 执行顺序与资源占用
- 原代码的执行顺序是严格串行的:当前线程的任务暂停 → 全局队列执行lambda逻辑 → 逻辑完成后当前线程继续。如果当前是线程池线程,会造成线程资源被占用无法处理其他任务。
- 改写后的执行顺序是并行的:当前线程继续处理自身任务,同时全局队列在后台执行lambda逻辑,线程资源利用率更高,但要注意如果lambda里有共享资源访问,需要额外处理线程安全问题。
内容的提问来源于stack exchange,提问作者Huong Tran
相关产品推荐
相关产品推荐

