我编写了一个控制台应用程序,它读取表格中的消息队列并将它们作为电子邮件发送给多个收件人。一个典型的使用场景是一次性发送 2000 封电子邮件,每封电子邮件都发送到不同的电子邮件地址,邮件正文略有不同(邮件合并名称、地址等)
该应用程序运行正常,似乎在一分半钟内处理了 2000 封邮件。我使用的方法非常简单(为简洁起见,我删除了 try..catch 块):
using (var mailBot = new SmtpClient())
{
foreach (var mail in dataContext.Mails
.Where(item => !item.IsSent)
.OrderBy(item => item.MailId)
.ToList())
{
mailBot.Send(new MailMessage(mail.MailFrom, mail.MailTo, mail.Subject, mail.Message));
mail.IsSent = true;
dataContext.SaveChanges();
}
}
现在,我的问题是,我怎样才能加快这个应用程序的运行速度?我觉得这种串行方法可能会通过使用SmtpClient.SendAsync()
来改进,但我担心我无法控制将创建多少线程,并且我仍然需要应用程序等待发送结果,因为我需要标记邮件是否发送成功。另外,我认为接收 SMTP 服务器只能处理一定数量的并发请求。
那么我是不是在自欺欺人地认为多线程解决方案可以加快邮件传递并允许应用程序更早退出?