我们正在使用ThreadPool发送电子邮件给用户asynchronoulsy。从本质上讲,我们有这样的逻辑:线程池和发送电子邮件
for (int i=0 < i < numUsers; i++)
{
//Pre email processing unrelated to sending email
string subject = GetSubject();
string message = GetMessage();
string emailAddress = GetEmailAddress();
EmailObj emailObj = new EmailObj { subject = subject, message = message, emailAddress = emailAddress };
bool sent = ThreadPool.QueueUserWorkItem(new WaitCallback(SendEmail), emailObj);
//Post email processing unrelated to sending email
}
public void SendEmail(object emailObj)
{
//Create SMTP client object
SmtpClient client = new SmtpClient(Configuration.ConfigManager.SmtpServer);
//Logic to set the subject, message etc
client.Send(mail);
}
该逻辑到目前为止效果很好,用户数量很少。我们正在努力扩展这个功能,以便能够发送100多万封电子邮件。
每MSDN,线程池的最大线程数是基于存储器,并根据此SO answer,对于64位架构,似乎线程池中的线程的最大数量为32768
这是否意味着,只要我们一次发送的电子邮件数量是< 32768,我们应该没问题?超过这个数字会发生什么?当SMTP服务关闭或者发送电子邮件有延迟时,会发生什么情况,线程池线程会等到电子邮件发送完成?
当线程数超过阈值时,标记为//发送电子邮件处理过程与发送电子邮件无关的部分是否会被执行?
任何解释都非常感谢。
使用任务,而不是ThreadPool。 – 2012-03-12 21:45:33
你的TCP堆栈还有其他限制。你可以做到SMTP服务器的32767同时出站TCP连接吗? – user957902 2012-03-12 21:53:08