透過 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!");
}
}
詳細程式參考
2008年5月14日 星期三
訂閱:
張貼留言 (Atom)
沒有留言:
張貼留言