SendMailAsync:在异步操作仍处于挂起状态时完成的异步模块或处理程序

时间:2015-05-18 14:59:30

标签: c# asp.net-mvc async-await task-parallel-library smtpclient

使用SendMailAsync时出现以下错误:

  

异步模块或处理程序在异步时完成   操作仍在等待

我的代码:

public static async Task SendEmail(MessageContent messageContent, string emailBody)
{
   SmtpClient smtpClientNoSend = new SmtpClient();
   await smtpClientNoSend.SendMailAsync(mailMessage);
}

来自控制器的呼叫:

public async System.Threading.Tasks.Task<ActionResult> Register()
{
   await SendEmail();
}

private void SendEmail()
{
  SMTPEmail.SendEmail(msg, output.ToString());
  return null;
}

1 个答案:

答案 0 :(得分:20)

您的通话层次结构已损坏。您不应该使用async void,仅限事件处理程序,而是使用async Task

public static Task SendEmailAsync(MessageContent messageContent, string emailBody)
{
   SmtpClient smtpClientNoSend = new SmtpClient();
   return smtpClientNoSend.SendMailAsync(mailMessage);
}

public async Task<ActionResult> Register()
{
   await SendEmailAsync();
}

private Task SendEmailAsync()
{
   return SMTPEmail.SendEmailAsync(msg, output.ToString());
}

旁注 - 我不确定为什么你有这么多SendMail方法,你可以将它们缩小到一个方法调用。