2015-04-01 32 views
5

我有以下的操作方法与asyncawait关键字:asp.net的MVC 5个异步操作方法

[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; 
    } 

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

+0

你得到什么错误? – tharif 2015-04-01 04:59:30

+0

@utility我没有收到任何错误。 'SendMails()'方法正在同步执行,而不是异步执行。应该在当前线程上调用return Json(“success”),并且SendMails()应该异步执行。 – seadrag0n 2015-04-01 05:02:55

回答

9

将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); 
} 
+0

这正是我需要的,它似乎在工作,但是在SendContactFormUserMail()函数我正在使用'StreamReader'类从文本文件中读取电子邮件模板,但我得到'对象引用未设置为对象的一个​​实例.'异常.. – seadrag0n 2015-04-01 05:52:32

+0

听起来像你的一个变量是'null'。这个问题的答案可能有所帮助:http://stackoverflow.com/questions/779091/what-does-object-reference-not-set-to-an-instance-of-an-object-mean – 2015-04-01 05:56:11

+1

我使用'HttpContext .Current.Server.MapPath()'方法读取文本文件,并在async方法中为空值... – seadrag0n 2015-04-01 06:09:08