2009年5月14日 星期四

非同步寄Mail

非同步(Asynchronous)的設計方式。我在們程式結束前,常常沒有辦法確定所有的mail是否傳送完成。所以這個範例如使用ManualResetEvent類別,利用WaitOne()Set()方法控制。等到所有的mail傳送完成才對離開foreach loop
using System.Net.Mail; 
using System.Threading;

protected static void SendMail(IEnumerable<MailMessage> msgs, string smtp_host)
{
foreach (MailMessage msg in msgs)
{
SmtpClient smtp = new SmtpClient(smtp_host);
smtp.SendCompleted += new SendCompletedEventHandler(SendCompletedCallback);
ManualResetEvent wait = new ManualResetEvent(false);
smtp.SendAsync(msg, new object[] {wait });
wait.WaitOne();
}
}
public static void SendCompletedCallback(object sender, AsyncCompletedEventArgs e)
{
object[] tokens = (object[])e.UserState;
ManualResetEvent wait = (ManualResetEvent)tokens[0];
wait.Set();
}

沒有留言: