2008年5月14日 星期三

透過 ThreadPool 執行 FreeSMTP 發信

透過 Thread 可以協助我們更有效率的處理耗時的工作,但每次都要因此去建立並維護自己的 Thread,不僅增加了程式碼的複雜度,有時還會有用大砲打小鳥的嫌疑。

在.Net 1.1 開始,就提供了 ThreadPool 的類別,讓 .Net 透過自己事先建立好的 Thread 並依據工作佇列自行去安排每個 Thread 要執行的功做。尤其是只做一次的工作,透過 ThreadPool 來完成會更有效率。

以下介紹利用 ThreadPool 來執行 FreeSMTP 的發信功能。

先建立一個收集發信資訊的類別:

public class MailObj
{
public string mail_From = string.Empty;
public string mail_To = string.Empty;
public string mail_Content = string.Empty;
public string mail_Subject = string.Empty;
public string mail_SMTP = string.Empty;

}


而發信的動作如下:
public void ThreadProc(Object stateInfo)
{

MailObj oM = (MailObj)stateInfo;

EmailMessage mail = null;
SMTP smtp = null;


mail = new EmailMessage();
//寄件者
mail.From.Email = oM.mail_From;

//收件者
mail.Recipients.Add(oM.mail_To, "收件人", RecipientType.To);

//主題
mail.Subject = oM.mail_Subject;

//mail 編碼
mail.CharsetEncoding = System.Text.Encoding.GetEncoding("BIG5");

//內容
BodyPart oBody = new BodyPart();
oBody.Body = oM.mail_Content;
mail.BodyParts.Add(oBody);

//SMTP
smtp = new SMTP(oM.mail_SMTP);


//執行發信
try
{
smtp.Send(mail);
}
catch (Exception ex)
{
//攔截錯誤訊息
}
}

最後,加上USER點選送信按鈕後觸發的事件:
protected void MailThread_Click(object sender, EventArgs e)
{
//將 thread 所需要的資訊存到一個物件 MailObj
MailObj oM = new MailObj();
oM.mail_From = txtComeFrom.Text;
oM.mail_To = txtTo.Text;
oM.mail_Content = txtContent.Text;
oM.mail_Subject = txtSubject.Text;
oM.mail_SMTP = txtSMTP.Text;



//指定要加入的工作
WaitCallback workItem = new WaitCallback(ThreadProc);

//將工作加入到 ThreadPool

// QueueUserWorkItem 的第一個參數,是指定要執行的方法名稱
// 第二個參數,則是用來設定傳值物件

if (!ThreadPool.QueueUserWorkItem(workItem, oM))
{
HttpContext.Current.Response.Write("錯誤訊息:無法排入 Thread Pool!");

}

}

詳細程式參考

沒有留言:

張貼留言