我看到项目使用orm例如SqlSugar或者ef的时候,喜欢使用如下int i= await DB.CountAsync(),
这个既然会一直等待数据返回Count,为啥不直接使用 int i=DB.Count();反正都是耗时那么久,async await相反还要使用一个Task开启一个异步,为什么还要使用async await。希望有人能解答下
await DB.CountAsync
会在等待异步 I/O 操作时释放当前线程,而线程是极其宝贵的资源
等到返回结果了再取回一个线程?
@灬丶: 是的
这是一个很好的观察!确实,使用async和await时,代码会等待异步操作完成,但这并不意味着整个程序会被阻塞。关键在于异步操作的机制。
当你使用await等待异步操作时,它允许程序继续执行其他任务,而不必等待当前的异步操作完成。这种方式允许你在等待的同时执行其他异步任务,从而提高并发性能。
比如,在异步等待数据库查询的同时,程序可以执行其他任务,而不必等待整个数据库查询完成。这是异步操作的优势之一,因为在等待的时间内,程序可以做其他有用的工作,而不是被阻塞。
总的来说,虽然async和await会等待异步操作的结果,但是在等待的过程中,它允许程序执行其他任务,从而保持了并发性和响应性。这是与同步操作不同的地方。
我们可以通过一个更简单、更通用的例子来说明,比如在洗衣服的场景中。
同步操作:
想象一下你有一堆脏衣服需要洗。
你一次只能洗一件衣服,而且你必须等待每一件衣服洗干净后才能开始洗下一件。
这样的处理方式是同步的,因为你必须等待每个任务(洗一件衣服)完成后才能继续下一个。
异步操作:
现在,假设你有一台先进的洗衣机,可以同时处理多件衣服。
你把所有脏衣服一次性放进洗衣机,然后启动它。
洗衣机会异步地处理每一件衣服,而你不必等待整个洗衣过程完成,可以去做其他事情。
这意味着在等待某些任务完成的同时,你可以同时处理其他任务,提高了效率。
在这个例子中,同步操作就像一次只能洗一件衣服,而异步操作允许你同时处理多个任务,就像一次性处理多件衣服。这种并发处理方式使得整体任务能够更迅速地完成。在编程中,异步操作也是为了类似的目的,提高程序的并发性和效率。