我看到有些代码,比如 asp.net core razor pages里的方法用了async/await 组合, 有些用了await 就是要同步等待结果,这里为什么不直接用同步的就是好了,而要而外使用 async/await 组合 比如下面代码。
public async Task<IActionResult> OnPostAsync()
{
if (!ModelState.IsValid)
{
return Page();
}
_dbContext.Categories.Add(Category);
await _dbContext.SaveChangesAsync();
return RedirectToPage("./Index");
}
使用了之后 async/await 有什么好处吗这里吗?
异步 提高并发能力
await
不是同步等待,是异步执行时释放当前钱程,提高线程的利用率。
这样可以很方便await(需求异步函数),尤其现代很多都是网络组件化的开发,那么会有很多模块实际也是异步的。
假如没有这种简化代码版本 —— 估计一些人甚至都不知道怎么阻塞。
传统“并行”(不一定是真并行)方式,不仅写作繁琐,常规使用也带来效率较低(见Thread使用)。
这种方式一般情况并不能真正提高HttpServer的运行效率,甚至很多时候是可能降低的(如长时计算型却过多的异步处理)——因为HttpServer本身就有Work池(Tcp连接池后将连接中的请求【任务】置于work池)管理,且提供了参数设置等等,这个设置就可以使cpu硬件以及任务类型达到一个较优参数选项。
较大的这种使用体会区别 —— 你可以看看android事件函数和传统的winForm时间函数,UI是串行的(射击成并行的一般没有意义,比如一个函数让变大,一个函数同时让变小,这样设计没有意义且会容易造成错误,因此是Invoke模式),但是Invoke之下比如文件操作,总不能卡着等待吧...Android就干脆简化,比如网络操作必须异步函数,这样直接和UI剥离,而传统winForm总有人出现写代码写出诡异,缺点当然就是——不够灵活,就像一个事件只能靠接口一样。
如果不做高性能的项目,就不用考虑async
很多时候不想用,但内部调用的模块方法只有异步方法。
@Adming: 那一定是那个方法有性能问题,通常framework会提供异步和同步的,如果只有异步,那就用异步,肯定是同步性能不好
@kiba518: 问题是日常应用中不止调用官方提供的模块,还有很多第三方的。为了减小麻烦,现在定义接口一开始就直接定义成异步的,省得后面才发现内部有对异步方法的调用导致重新定义方法签名。