- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我不明白调用 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 的解释澄清了所有这些并且是正确的。
最佳答案
这两个方法调用的区别在于,前者在调用时使用 await
异步等待。因此,TaskCanceledException
从内部 SendEmailAsync
调用传播,这是因为您没有等待 using
中的异步方法作用域,这会导致处理 SmtpClient
和异步调用结束之间的竞争条件。而在后者中,异常被封装在返回的 Task
对象中,我不确定您是否正在等待。这就是为什么在前者中,您会立即看到异常。
首先应该做的是在网关内的 SendEmailAsync
上正确等待:
public class SmtpEmailGateway : IEmailGateway
{
public async Task SendEmailAsync(MailMessage mailMessage)
{
using (var smtpClient = new SmtpClient())
{
return await smtpClient.SendMailAsync(mailMessage);
}
}
}
然后,您可以使用第二种方法来避免创建状态机的开销。不同之处在于,现在您要保证 SmtpClient
只会在异步操作完成后进行处理。
关于c# - SendMailAsync 导致 TaskCanceledException 的原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33523922/
我正在尝试根据 VS2013 项目模板中的示例 AccountController 为 ASP.NET MVC5 网站设置电子邮件确认。我已经使用 SmtpClient 实现了 IIdentityMe
我在 .net 4.5 中有一个 C# wcf Windows 服务,它每天向大约 1000 个不同的客户发送电子邮件。我想尝试使用我在 SO 上找到的这段代码异步发送电子邮件,但我应该如何包装它以捕
我正在通过 C# 的 SmtpClient.SendMailAsync 发送邮件,但我遇到了一些非常奇怪的行为。 当我调用 SendMailAsync 时,电子邮件已发送 - 我每次都会收到。但是,我
SmtpClient Class指出实例成员不是线程安全的。如果对 Send 进行并发调用,则可以看到这一点或 SendAsync .如果第一次调用尚未完成,这两种方法都将在第二次调用时抛出 Inva
我正在尝试使用 SmtpClient.SendMailAsync 方法发送大量电子邮件。这是我从简单控制台应用程序调用的测试方法。 static void Main(string[] args
我不明白调用 SendMailAsync 的这两种实现之间的区别。大多数情况下,对于第一个,我会收到 TaskCanceledException,但对于第二个,一切都按预期进行。 我认为这两种消费方法
我正在尝试从我的 MVC 应用程序发送电子邮件,当我使用 .Send() 方法时它发送正常,但需要一段时间才能返回,所以我想使用 .SendMailAsync() 函数,但我收到了执行期间出现以下错误
我阅读了async-await功能的文档,但仍然对如何构造调用SmtpClient.SendMailAsync() { try { awa
我正在尝试通过 C# 中的 ASP MVC Web 应用程序设置 Office 365 集成,为此我使用了 Outlook Mail REST API(客户端版本)。我一直在这里使用 API 引用:h
我是一名优秀的程序员,十分优秀!