1、什麼是線程池?
線程池是一種多執行緒形式,處理過程中將任務添加到隊列,然後在建立線程後自動啟動這些任務。線程池線程都是後台線程。每個線程都使用預設的堆棧大小,以預設的優先順序運行,並處於多執行緒 Apartment中。
2、使用線程池的好處
應用程式可以有多個線程,這些線程在休眠狀態中需要耗費大量時間來等待事件發生。其他線程可能進入睡眠狀態,並且僅定期被喚醒以輪循更改或更新狀態資訊,然後再次進入休眠狀態。為了簡化對這些線程的管理,.NET架構為每個進程提供了一個線程池,一個線程池有若干個等待操作狀態,當一個等待操作完成時,線程池中的輔助線程會執行回呼函數。線程池中的線程由系統管理,程式員不需要費力於線程管理,可以集中精力處理應用程式任務。
3、下面我為大家舉一個小的例子來實現線程池的使用:
前台為Winform表單,建立兩個Button按和一個文字框
後台來實現事件:
//線程池Click事件
private void button3_Click(object sender, EventArgs e)
{
//這麼寫其實只是讓線程池啟動了一個線程,沒有利用多線程來操作
WaitCallback wait = new WaitCallback(DownLoadPool);
ThreadPool.QueueUserWorkItem(wait);
}
//線程池方法
private void DownLoadPool(object obj)
{
for (int i = 30000; i < 30010; i++)
{
try
{
using (WebClient client = new WebClient())
{
client.DownloadFile(@"http://job.cnblogs.com/offer/" + i + "/", @"e:\movie\" + i + ".html");
//使用匿名委託的簡寫方法
this.Invoke(new Action(delegate()
{
this.textBox1.AppendText("第" + i + "個文章已經下載");
}));
}
}
catch (Exception ex) { }
}
Action action = new Action(Down);
this.Invoke(action);
}
//多線程池Click事件
private void button4_Click(object sender, EventArgs e)
{
for (int i = 30000; i < 30010; i++)
{
WaitCallback wait = new WaitCallback(DownLoadPool1);
ThreadPool.QueueUserWorkItem(wait, i);
}
}
//多線程池方法
private void DownLoadPool1(object obj)
{
try
{
using (WebClient client = new WebClient())
{
client.DownloadFile(@"http://job.cnblogs.com/offer/" + Convert.ToInt32(obj) + "/", @"e:\movie\" + Convert.ToInt32(obj) + ".html");
//使用匿名委託的簡寫方法
this.Invoke(new Action(delegate()
{
this.textBox1.AppendText("第" + Convert.ToInt32(obj) + "個文章已經下載");
}));
}
}
catch (Exception ex) { }
}
4、上面一個簡單的小例子就是為了實現線程池的功能,可能上面的例子線程池的耗費有可能會因自己的機子而有所不同的得值
還有使用線程池時還應該注意到的問題,當下面的情況出現時,就不應該在運用線程池來實現效果了
(1)、如果需要使一個任務具有特定優先順序
(2)、如果具有可能會長時間運行(並因此阻塞其他任務)的任務
(3)、如果需要將線程放置到單一執行緒 Apartment中(線程池中的線程均處於多執行緒 Apartment中)
(4)、如果需要永久標識來標識和控制線程,比如想使用專用線程來終止該線程,將其掛起或按名稱發現它
System.ThreadingPool類實現了線程池,這是一個靜態類,它提供了管理線程的一系列方法
Threading.QueueUserItem方法線上程池中建立一個線程池線程來執行指定方法(用委託WaitCallBack表示),並將該線程排入線程池的隊列等待執行。