1

ウェブサイトを持っていますが、700 通のメールを一度に送信しようとしたときに問題が発生しました。100通のメールを7回送った方がいいと思っているのですが、どのようなアプローチをすればよいのでしょうか?

  • for ループを使用してメールを 7 回送信することもできますが、メールの量が 2 倍になった場合など、このアプローチに問題はありますか?
  • スレッド化。これは初めてで、時間がかかります。

これが私のコードです:

protected void btnClick_Send(object sender, EventArgs e)
{
     MailMessage mailObj = new MailMessage();
     mailObj.Bcc.Add(txtReciever.Text.Trim());
     mailObj.ReplyToList.Add("our-reply-email@oursite.com");
     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);
}  

他のアイデアはありますか?

4

1 に答える 1

1

これは間違いなく、並列処理から大きな利益を得る、恥ずかしい並列問題の 1 つです。

.NET 4.0 では、 Parallel.ForEachメソッドを使用するだけで、そのコードを並列で実行できます。

が、送信する電子メールの と を含む一連のオブジェクトであると仮定すると、この例では、タスク並列messagesライブラリを使用して、マシンで使用可能なリソースを考慮して、できるだけ多くのオブジェクトを並列で自動的に送信します。ReceiverSubjectBody

Parallel.ForEach(messages, message =>
{
     MailMessage mailObj = new MailMessage();
     mailObj.Bcc.Add(message.Receiver);
     mailObj.ReplyToList.Add("our-reply-email@oursite.com");
     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メソッドを使用して、異なるスレッドで送信される電子メールを手動でスケジュールすることができますが、それには間違いなくより多くの労力が必要です。

于 2012-02-16T10:39:35.543 に答える