我正在浏览一个ASP.NET MVC应用程序,并且有一些代码调用SaveChangesAsync(),以便在实体更新时保存对数据库的更改,但调用函数中的下一个语句是return语句。根据我的理解,调用SaveChangesAsync()会将控件返回给调用函数,所以我很困惑为什么当它已经在函数末尾时需要使用SaveChangesAsync()。例如,在下面的代码中,调用函数中的下一个语句是return RedirectToAction(...);
// Calling function
[HttpPost]
public async Task<ActionResult> Edit(Person p)
{
await PersonRepository.UpdatePerson(p);
return RedirectToAction(...);
}
// PersonRepository.UpdatePerson
public async Task<bool> UpdatePerson(Person p)
{
...
await db.SaveChangesAsync();
return true;
}
答案 0 :(得分:5)
是的,如果没有逻辑继续等待操作,则使用await是有意义的。
等待的一个主要优点是它将执行控制返回给调用环境。这允许在等待操作完成时执行其他计划任务。
在您的情况下,这意味着控制权将返回给Web主机,从而允许服务器上的其他任务计算一些处理时间
答案 1 :(得分:1)
基本上,在数据库连接期间,可以重用当前线程来处理其他请求。换句话说,在等待来自数据库连接的响应时,当前线程不会被阻塞。
一个现实生活中的例子
你要求调酒师提供咖啡..
在阻止情况下,你正在看酒保并等她给你一杯咖啡
在async await场景中,当调酒师准备你的咖啡时,你正在检查你的电子邮件和做其他事情
答案 2 :(得分:1)
异步函数的优点在于,您的函数不必等到它调用的异步操作完成,至少在您调用等待之前。
对于您的客户来说也是如此:如果他们调用您的异步功能,他们可以继续使用他们的下一个语句,而SaveAsync一直等到它完成,即使您不必在保存期间做一些有用的事情,因此等待SaveAsync。
缺点是必须声明为异步,并且必须将所有客户端声明为异步才能从async-await中受益
答案 3 :(得分:0)
SaveChangesAsync
只关闭数据库上的事务,提交所有必要的更改。它不会回来。要结束期望bool返回值的方法,必须返回bool,这是下一行的作用。现在,老实说,他们应该使用SaveChangesAsync
的结果做一些事情,这是插入或更新的对象数量的整数计数,或者更好,将它包装在try-catch中并且只返回true如果没有引发异常。但是,如果不调用SaveChangesAsync
,实际上不会向数据库提交任何内容,因此绝对需要。