我們正在使用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