2012-02-16 42 views
1

我們有一個網站,當我們嘗試發送700封電子郵件時,我們遇到了一個問題。我認爲最好發送7次100封電子郵件,但我應該採取哪種方法?將一個批量電子郵件拆分爲幾個

  • 我可以使用for循環併發送7次電子郵件,但這種方法有什麼問題,例如:如果電子郵件的數量增加一倍?
  • 線程,我是新手,需要更多時間。

這裏是我的代碼:

protected void btnClick_Send(object sender, EventArgs e) 
{ 
    MailMessage mailObj = new MailMessage(); 
    mailObj.Bcc.Add(txtReciever.Text.Trim()); 
    mailObj.ReplyToList.Add("[email protected]"); 
    mailObj.SubjectEncoding = System.Text.Encoding.UTF8; 
    mailObj.BodyEncoding = System.Text.Encoding.UTF8; 
    mailObj.Subject = txtSubject.Text; 
    mailObj.Body += Environment.NewLine; 
    mailObj.Body = txtContent.Text; 
    mailObj.Body += Environment.NewLine; 
    SmtpClient SMTPServer = new SmtpClient(); 
    SMTPServer.Send(mailObj); 
} 

任何其他的想法?

+0

您使用的是哪個版本的.NET? – 2012-02-16 10:27:36

+0

我目前在2.0,但我認爲如果有必要,我可以升級到4。 – Niklas 2012-02-16 10:39:08

回答

1

這絕對是那些embarrassingly parallel problems之一,它將從並行性中獲益。

在.NET 4.0中,只需使用Parallel.ForEach方法即可使該代碼並行運行。

假設messages是包含ReceiverSubject和電子郵件發送的Body對象的序列,這個例子使用Task Parallel Library自動發送因爲其中許多儘可能出並行給出的可用資源在機器上:

Parallel.ForEach(messages, message => 
{ 
    MailMessage mailObj = new MailMessage(); 
    mailObj.Bcc.Add(message.Receiver); 
    mailObj.ReplyToList.Add("[email protected]"); 
    mailObj.SubjectEncoding = System.Text.Encoding.UTF8; 
    mailObj.BodyEncoding = System.Text.Encoding.UTF8; 
    mailObj.Subject = message.Subject; 
    mailObj.Body += Environment.NewLine; 
    mailObj.Body = message.Body; 
    mailObj.Body += Environment.NewLine; 
    SmtpClient SMTPServer = new SmtpClient(); 
    SMTPServer.Send(mailObj); 
} 

當然,可以實現在.NET 2.0相同的溶液爲好,例如使用ThreadPool.QueueUserWorkItem方法手動調度電子郵件在不同線程上被髮送出去,但它肯定會需要更多的努力。

+0

這和for循環有什麼區別?詢問,因爲我不知道... – Niklas 2012-02-16 10:43:47

+0

傳統的循環將按順序*一次處理物品*。一個[並行循環](http://msdn.microsoft.com/en-us/library/dd989744.aspx)會自動將列表分解成塊並同時處理它們*。塊的數量和大小取決於機器上可用的資源,如CPU內核的數量。 – 2012-02-16 10:50:38