在 async
/await
异步模型(即 TAP Task-based Asynchronous Pattern)出现以前,有大量的同步代码存在于代码库中,以至于这些代码全部迁移到 async
/await
可能有些困难。这里就免不了将一部分异步代码修改为同步代码。然而传统的迁移方式存在或多或少的问题。本文将总结这些传统方法的坑,并推出一款异步转同步的新方法,解决传统方法的这些坑。
背景问题和传统方法
- 为什么有些方法不容易迁移到
async
/await
?
- 参见微软的博客
async
/await
最佳实践 Async/Await - Best Practices in Asynchronous Programming。如果某个方法从同步方法修改为异步方法(例如从var content = file.Read()
修改为var content = await file.ReadAsync()
),那么调用此方法的整个调用链全部都要改成async
/await
才能让返回值在调用链中成功传递。
- 参见微软的博客
- 传统的异步转同步的方法有哪些?有什么坑?
- 参见我的好朋友林德熙的博客 win10 uwp 异步转同步。文章里使用
Task.Wait()
或者Task.Result
来获取异步方法的返回值。 - 这种方法会阻塞调用线程。如果调用线程是 UI 线程,那么 UI 将会无响应;更严重地,如果 UI 线程使用
DispatcherSynchronizationContext
(参见我的另一篇文章 DispatcherSynchronizationContext - walt
- 参见我的好朋友林德熙的博客 win10 uwp 异步转同步。文章里使用