在多線程的程序中,經常會出現兩種情況:
一種情況:
應用程序中,線程把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應
這一般使用ThreadPool(線程池)來解決;
另一種情況:線程平時都處於休眠狀態,只是周期性地被喚醒
這一般使用Timer(定時器)來解決;
ThreadPool類提供一個由系統維護的線程池(可以看作一個線程的容器),該容器需要 Windows 2000 以上系統支持,因為其中某些方法調用了只有高版本的Windows才有的API函數。
將線程安放在線程池裡,需使用ThreadPool.QueueUserWorkItem()方法,該方法的原型如下:
//將一個線程放進線程池,該線程的Start()方法將調用WaitCallback代理對象代表的函數
public static bool QueueUserWorkItem(WaitCallback);
//重載的方法如下,參數object將傳遞給WaitCallback所代表的方法
public static bool QueueUserWorkItem(WaitCallback, object);
注意:
ThreadPool類是一個靜態類,你不能也不必要生成它的對象。而且一旦使用該方法在線程池中添加了一個項目,那麼該項目將是無法取消的。
在這裡你無需自己建立線程,只需把你要做的工作寫成函數,然後作為參數傳遞給ThreadPool.QueueUserWorkItem()方法就行了,傳遞的方法就是依靠WaitCallback代理對象,而線程的建立、管理、運行等工作都是由系統自動完成的,你無須考慮那些復雜的細節問題。
ThreadPool 的用法:
首先程序創建了一個ManualResetEvent對象,該對象就像一個信號燈,可以利用它的信號來通知其它線程。
本例中,當線程池中所有線程工作都完成以後,ManualResetEvent對象將被設置為有信號,從而通知主線程繼續運行。
ManualResetEvent對象有幾個重要的方法:
初始化該對象時,用戶可以指定其默認的狀態(有信號/無信號);
在初始化以後,該對象將保持原來的狀態不變,直到它的Reset()或者Set()方法被調用:
Reset()方法:將其設置為無信號狀態;
Set()方法:將其設置為有信號狀態。
WaitOne()方法:使當前線程掛起,直到ManualResetEvent對象處於有信號狀態,此時該線程將被激活。然後,程序將向線程池中添加工作項,這些以函數形式提供的工作項被系統用來初始化自動建立的線程。當所有的線程都運行完了以後,ManualResetEvent.Set()方法被調用,因為調用了ManualResetEvent.WaitOne()方法而處在等待狀態的主線程將接收到這個信號,於是它接著往下執行,完成後邊的工作。