c# - C# 使用取消令牌异步发送多封电子邮件
问题描述
我正在尝试使用 SendMailAsync 发送多条消息,并且我正在尝试传递取消令牌以在请求取消时中断发送过程。
static void Send(SmtpClientFactory factory, IEnumerable<MailMessage> messages)
{
Task.WaitAll(SendAsync(factory, messages, CancellationToken.None));
}
static async Task SendAsync(SmtpClientFactory factory, IEnumerable<MailMessage> messages, CancellationToken token)
{
await Task.Run(async () =>
{
using (SmtpClient smtpClient = factory())
{
foreach (MailMessage message in messages)
{
await smtpClient.SendMailAsync(message).ConfigureAwait(false);
}
}
}, token);
}
当我使用非异步发送时,它会陷入死锁。如何同步发送消息并在时间到时使用取消令牌取消?
解决方案
您可以结合CancellationToken.Register
并SmtpClient.SendAsyncCancel
做您需要的事情:
static async Task SendAsync(SmtpClientFactory factory, IEnumerable<MailMessage> messages, CancellationToken token)
{
await Task.Run(async () =>
{
using (SmtpClient smtpClient = factory())
{
foreach (MailMessage message in messages)
{
token.ThrowIfCancellationRequested();
using (token.Register(() => smtpClient.SendAsyncCancel()))
{
await smtpClient.SendMailAsync(message).ConfigureAwait(false);
}
}
}
}, token);
}
请记住,SmtpClient
已正式弃用:
SmtpClient 及其网络类型设计不佳,我们强烈建议您改用https://github.com/jstedfast/MailKit和https://github.com/jstedfast/MimeKit
MailKit 不仅线程安全,而且在消息构造方面更加灵活,并且支持CancellationToken
启动!
推荐阅读
- c++ - 如何让两个 QGraphicsViews 同时滚动?
- express - 我们如何记录每个 http 请求和响应并将其保存到数据库中
- java - 在 JComboBox 上键入时从数据库中自动过滤 JComboBox 数据
- c# - 如何从文本框中删除某组字符
- excel - 如何使用 vba 创建带有图片比例 url 的图片评论
- nginx - 通过 Jenkins 自动化自己的工作并通过 HTTPD 或 NGINX 在 Kubernetes 上发布
- node.js - SequlizeJS 连接经常超时
- spring - Spring - RESTful 提供不同的实体表示
- elasticsearch - 如何在 Kibana 中可视化来自 Kafka 的消息
- bash - 如何在 DolphinDB 中从命令行运行脚本