我编写了一个控制台应用程序,它可以读取表中的消息队列,并将其作为电子邮件发送给多个收件人。一个典型的使用场景是一次发送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服务器只能处理一定数量的并发请求。
所以我自欺欺人地认为多线程解决方案可以加快邮件传递并允许应用程序提前退出?