【发布时间】:2019-03-28 20:44:27
【问题描述】:
我不明白这两种调用 SendMailAsync 的实现之间的区别。在第一次的大部分时间里,我都收到了一个 TaskCanceledException,但在第二次中,一切都按预期工作。
我认为这两种消费方法是等效的,但显然我错过了一些东西。
这似乎与 TaskCanceledException when not awaiting 相关但相反
// 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? -
Caller1 和 Caller2 是 Azure WebJobs SDK 调用的公共方法。 SDK 支持异步方法。
标签: c# async-await smtpclient