如何从返回任务的方法中提前正确退出?

时间:2016-02-15 20:36:36

标签: c# async-await asp.net-identity smtpclient

我有一个返回Task的方法,特别是它是SendAsync的{​​{1}}方法。

现在,我知道如何使用IIdentityMessageService作为直接的方法。但我的问题是我的接口client.SendAsync()方法执行其他检查和验证。如果一切正常,它会调用SendAsync并完成。

但正如我所提到的,该方法执行检查和验证,如果发现不正确的东西,我应该使用什么样的返回签名?有没有办法在那种情况下检索错误信息?

对于那些明确的东西,不应该是对代码的需求,但是如果你需要对它进行可视化,那么这就是我的意思......

smtpClient.SendAsync

对于我看到的public class EmailService : IIdentityMessageService { public Task SendAsync(IdentityMessage message) { SmtpClient smtp = new SmtpClient(); if (everythingIsOkay) { return smtp.SendEmailAsync(); // (BBBB) } else // something is not right { // <= THIS IS WHAT I NEED (AAAA) } } } 使用AccountController所以它等待任务完成但是我如何在await - 得到它是否因为终止而终止的结果AAAA或BBBB?

1 个答案:

答案 0 :(得分:2)

那么,如果代码是同步的,你会怎么做?

public void Send(IdentityMessage message)
{
   SmtpClient smtp = new SmtpClient();
   // some stuff here to configure SmtpClient
   if (everythingIsOkay)
      smtp.SendEmail();
   else  // something is not right
      ???
}

可能是这样的:

public void Send(IdentityMessage message)
{
   SmtpClient smtp = new SmtpClient();
   // some stuff here to configure SmtpClient
   if (everythingIsOkay)
      smtp.SendEmail(); // throws an exception on error
   else  // something is not right
      throw new ConfigurationException(...);
}

所以,你以同样的方式异步进行:

public async Task SendAsync(IdentityMessage message)
{
   SmtpClient smtp = new SmtpClient();
   // some stuff here to configure SmtpClient
   if (everythingIsOkay)
      await smtp.SendEmailAsync(); // throws an exception on error
   else  // something is not right
      throw new ConfigurationException(...);
}