C#多線程學習(四)多線程的自動管理(線程池)

來源:互聯網
上載者:User

在多線程的程式中,經常會出現兩種情況:

一種情況:

應用程式中,線程把大部分的時間花費在等待狀態,等待某個事件發生,然後才能給予響應

這一般使用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()方法而處在等待狀態的主線程將接收到這個訊號,於是它接著往下執行,完成後邊的工作。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.