如何将采用空对象模式的同步DB查询方法转为异步方法
嘿,这事儿改起来超简单的,我给你捋清楚怎么把同步方法转成符合规范的异步版本:
同步转异步的核心改动点
只需要遵循.NET异步编程的几个惯例,同时完全保留你原来的空对象逻辑就行:
调整方法签名
- 给方法名加上
Async后缀(这是.NET社区通用的异步方法命名规范,方便调用者一眼识别) - 返回类型从
ResultObj改成Task<ResultObj>,异步方法需要返回任务对象来标记执行状态 - 在方法声明前加上
async关键字,这样才能在方法内部使用await关键字
- 给方法名加上
替换数据库调用为异步版本
- 把原来的同步查询
dbContext.GetSomeResult()换成await dbContext.GetSomeResultAsync(),用await等待异步IO操作完成,拿到实际的查询结果
- 把原来的同步查询
保留空对象替换逻辑
- 原来的空合并运算符
??完全可以继续用,因为await之后得到的结果类型和同步场景一致,逻辑不需要任何修改
- 原来的空合并运算符
最终的异步方法代码如下:
public async Task<ResultObj> GetAsync() { var result = await dbContext.GetSomeResultAsync(); return result ?? ResultObj.NullValue; }
额外小提醒
- 尽量保证调用链全异步:如果这个
GetAsync被其他方法调用,记得也要用await等待它完成,避免用GetAwaiter().GetResult()这类阻塞调用(容易引发死锁问题) - 不用额外加
Task.Run包裹数据库操作:EF Core的异步方法本身就是IO-bound操作,await会自动释放当前线程直到操作完成,没必要手动开新线程
内容的提问来源于stack exchange,提问作者Marcello
相关产品推荐
相关产品推荐

