asp.net mvc 5异步动作方法

sea*_*g0n 6 c# asp.net asp.net-mvc asynchronous

我有以下操作方法asyncawait关键字:

[HttpPost]
public async Task<ActionResult> Save(ContactFormViewModel contactFormVM)
{
     if (domain.SaveContactForm(contactFormVM) > 0)// saves data in database
     {
         bool result = await SendMails(contactFormVM);//need to execute this method asynchronously but it executes synchronously
         return Json("success");
     }
         return Json("failure");
  }

    public async Task<bool> SendMails(ContactFormViewModel contactFormVM)
    {
            await Task.Delay(0);//how to use await keyword in this function?
            domain.SendContactFormUserMail(contactFormVM);
            domain.SendContactFormAdminMail(contactFormVM);
            return true;
    }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,一旦数据库操作完成,我想立即返回Json()结果然后调用SendMails()应该在后台执行的方法.我应该对上面的代码做出哪些更改?

Ste*_*ler 10

await运算符应用于异步方法中的任务,以暂停方法的执行,直到等待的任务完成.该任务代表了正在进行的工

听起来你不想等待SendMails的结果.考虑异步并等待使用异步API的工具.具体来说,能够"等待""异步"任务的结果非常有用.但是,如果您不关心"异步"(例如SendMails)任务的结果,那么您不需要"等待"结果(即布尔值).

相反,您可以简单地使用Task.Run来调用您的异步任务.

[HttpPost]
public async Task<ActionResult> Save(ContactFormViewModel contactFormVM) {
  if (domain.SaveContactForm(contactFormVM) > 0) {// saves data in database 
    Task.Run(() => SendMails(contactFormVM));
    return Json("success");
  }
  return Json("failure");
}

public void SendMails(ContactFormViewModel contactFormVM) {
  domain.SendContactFormUserMail(contactFormVM);
  domain.SendContactFormAdminMail(contactFormVM);
}
Run Code Online (Sandbox Code Playgroud)