摘要:ThreadPool.QueueUserWorkItem多執行緒
善用多執行緒的技巧,可以讓應用程式執行的更順暢,減少因進行長時間動作而使UI凍結的情況。但執行緒也不是免費的,每個執行緒需要大約1 MB的記憶體,建立及啟動也需要花一點時間,為了減輕建立執行緒時所耗費的時間,.NET Framework 2.0提出了Thread Pooling概念,底層CLR會維持固定數量的執行緒運行,當設計師透過呼叫QueueUserWorkItem函式將delegate傳入時,Thread Pool會查看目前是否有閒置的Thread於Pool池中,有的話就讓這個Thread來呼叫傳入的delegate,否的話就建立一個新的Thread來執行,Thread Pool透過預建Thread的方式,來減少因頻繁建立/釋放 Thread而耗費的時間。
下列為正常寫法
private void setText(Object str)
{
using (StreamWriter sw = new StreamWriter(@"D:\test.txt",true,Encoding.UTF8))
{
sw.WriteLine(str.ToString());
}
}
protected void Button1_Click(object sender, EventArgs e)
{
string str = "測試四";
ThreadPool.QueueUserWorkItem(new WaitCallback(setText),(Object) str);
}
下列為委派方式簡化程式碼
protected void Button1_Click(object sender, EventArgs e)
{
string str = "測試三";
ThreadPool.QueueUserWorkItem(delegate
{
using (StreamWriter sw = new StreamWriter(@"D:\test.txt", true, Encoding.UTF8))
//路徑 , 不複寫檔案 , 編碼
{
sw.WriteLine(str);
}
});
}
下列為Lambda寫法
protected void Button1_Click(object sender, EventArgs e)
{
string str = "測試五";
ThreadPool.QueueUserWorkItem(callback =>
{
using (StreamWriter sw = new StreamWriter(@"D:\test.txt", true, Encoding.UTF8))
{
sw.WriteLine(str.ToString());
}
});
}
出處:http://www.dotblogs.com.tw/code6421/archive/2010/02/25/13766.aspx#22283