use*_*312 5 c# email asynchronous sendgrid asp.net-web-api
我有一个WebApi控制器,其中一个部分是向一组用户发送电子邮件.
[HttpPost]
[Authorize]
[Route("{id}/Do")]
public async Task<HttpResponseMessage> Post(int id, Model model)
...
await _emailService.SendAsync(message);
...
Run Code Online (Sandbox Code Playgroud)
现在发送电子邮件的方法(SendGrid)
public override async Task SendAsync(MailMessage message)
{
var client =
new SmtpClient(SendGridServerName, SendGridServerPort)
{
Port = SendGridServerPort,
DeliveryMethod = SmtpDeliveryMethod.Network,
UseDefaultCredentials = false
};
var credentials = new NetworkCredential(SendGridUserName, SendGridPassword);
client.EnableSsl = true;
client.Credentials = credentials;
message.From = new MailAddress(FromAddress);
await client.SendMailAsync(message);
}
Run Code Online (Sandbox Code Playgroud)
一切正常,但速度很慢.我期待它快,但await _emailService.SendAsync(message);看起来并不是异步.它停在那里一段时间.
有任何想法吗?
谢谢
什么async是允许您的服务器在异步执行慢速方法时运行其他线程.即,当您await使用异步方法时,服务器会执行不同的线程,直到async方法完成执行,然后继续运行调用异步方法的线程.控制器中的异步操作在幕后完全以相同的方式处理.因此,在电子邮件发送完成async之前,您的操作对浏览器的响应不会发生async.
注意:例如,如果电子邮件服务器存在连接问题或DNS解析,您通常会在30秒后获得超时,因此您的线程将在30秒内睡眠,然后才会将答案发送到浏览器
如果你想快速将响应返回给你的浏览器,你需要实现一个不同的想法,即启动一个发送电子邮件的新线程,但不要等待它完成,这样你的线程就会一直运行将asnwer返回给浏览器.这被称为火和忘记.要了解我在说什么,请看到:火灾和遗忘的方法.然后仔细阅读其他内容:Fire和Forget(Asynch)ASP.NET方法调用.考虑到MVC本身是线程化的,你需要在使用fire and forget方法时考虑它.
在火灾和遗忘中,控制器将无法在电子邮件发送过程中检测到错误,因为新线程在主线程已经完成时自行运行.因此,您必须实现某些内容以至少记录可能的错误,并且理想情况下让用户现在发生了什么(例如,哪些报告他稍后可以看到).请看这个:后台线程中的ASP.NET异常处理
| 归档时间: |
|
| 查看次数: |
4668 次 |
| 最近记录: |