我不理解调用SendMailAsync的这两种实现方式之间的区别。在第一种方式中,我大部分时间都会收到TaskCanceledException异常,但是在第二种方式中,一切都按预期工作。
我原以为这两种方法是等效的,但显然我漏掉了什么。
这似乎与以下内容有关,但相反:未等待时的TaskCanceledException
// Common SmtpEmailGateway library
public class SmtpEmailGateway : IEmailGateway
{
public Task SendEmailAsync(MailMessage mailMessage)
{
using (var smtpClient = new SmtpClient())
{
return smtpClient.SendMailAsync(mailMessage);
}
}
}
// Caller #1 code - Often throws TaskCanceledException
public async Task Caller1()
{
// setup code here
var smtpEmailGateway = new SmtpEmailGateway();
await smtpEmailGateway.SendEmailAsync(myMailMessage);
}
// Caller #2 code - No problems
public Task Caller2()
{
// setup code here
var smtpEmailGateway = new SmtpEmailGateway();
return smtpEmailGateway.SendEmailAsync(myMailMessage);
}
编辑:事实证明,Caller2方法也会导致异常,只是由于WebJobs框架调用该方法时没有显示异常。Yuval的解释澄清了所有问题,并且是正确的。
Caller1
和Caller2
的? - Yuval Itzchakov