当调用函数中的下一行是return语句时,使用SaveChangesAsync()有什么好处?

时间:2015-12-17 14:50:33

标签: c# asp.net-mvc-4 async-await

我正在浏览一个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;
}

4 个答案:

答案 0 :(得分:5)

是的,如果没有逻辑继续等待操作,则使用await是有意义的。

等待的一个主要优点是它将执行控制返回给调用环境。这允许在等待操作完成时执行其他计划任务。

在您的情况下,这意味着控制权将返回给Web主机,从而允许服务器上的其他任务计算一些处理时间

答案 1 :(得分:1)

基本上,在数据库连接期间,可以重用当前线程来处理其他请求。换句话说,在等待来自数据库连接的响应时,当前线程不会被阻塞。

一个现实生活中的例子

你要求调酒师提供咖啡..

  • 你:嗨,我想要一杯咖啡
  • 调酒师:这是..

在阻止情况下,你正在看酒保并等她给你一杯咖啡

在async await场景中,当调酒师准备你的咖啡时,你正在检查你的电子邮件和做其他事情

答案 2 :(得分:1)

异步函数的优点在于,您的函数不必等到它调用的异步操作完成,至少在您调用等待之前。

对于您的客户来说也是如此:如果他们调用您的异步功能,他们可以继续使用他们的下一个语句,而SaveAsync一直等到它完成,即使您不必在保存期间做一些有用的事情,因此等待SaveAsync。

缺点是必须声明为异步,并且必须将所有客户端声明为异步才能从async-await中受益

答案 3 :(得分:0)

SaveChangesAsync只关闭数据库上的事务,提交所有必要的更改。它不会回来。要结束期望bool返回值的方法,必须返回bool,这是下一行的作用。现在,老实说,他们应该使用SaveChangesAsync的结果做一些事情,这是插入或更新的对象数量的整数计数,或者更好,将它包装在try-catch中并且只返回true如果没有引发异常。但是,如果不调用SaveChangesAsync,实际上不会向数据库提交任何内容,因此绝对需要。