[摘要]本文介紹c#
winform多線程開發之threadpool 與 timer,并提供詳細的示例代碼供參考。
本文接上文,繼續探讨winform中的多線程問題,再次主要探讨threadpool 和timer。
線程池(threadpool)是一種相對較簡單的方法,它适應于一些需要多個線程而又較短任務(如一些常處于阻塞狀态的線程),它的缺點是對建立的線程不能加以控制,也不能設定其優先級。由于每個程序隻有一個線程池,當然每個應用程式域也隻有一個線程池(對線),是以你将發現 threadpool類的成員函數都為static!當你首次調用threadpool.queueuserworkitem、 threadpool.registerwaitforsingleobject等,便會建立線程池執行個體。下面我就線程池當中的兩函數作一介紹:
此函數的作用是把要建立的線程排隊到線程池,當線程池的可用線程數不為零時(線程池有建立線程數的限制,缺身值為25),便建立此線程,否則就排隊到線程池等到它有可用的線程時才建立。
此函數的作用是建立一個等待線程,一旦調用此函數便建立此線程,在參數waitobject變為終止狀态或所設定的時間timeout到了之前,它都處于 “阻塞”狀态,值得注意的一點是此“阻塞”與thread的waitsleepjoin狀态有很大的不同:當某thread處于 waitsleepjoin狀态時cpu會定期的喚醒它以輪詢更新狀态資訊,然後再次進入waitsleepjoin狀态,線程的切換可是很費資源的;而用此函數建立的線程則不同,在觸發它運作之前,cpu不會切換到此線程,它既不占用cpu的時間又不浪費線程切換時間,但cpu又如何知道何時運作它?實際上線程池會生成一些輔助線程用來監視這些觸發條件,一旦達到條件便啟動相應的線程,當然這些輔助線程本身也占用時間,但是如果你需建立較多的等待線程時,使用線程池的優勢就越加明顯。
更詳細内容demo:
一個很值得擴充的地方時,這裡的invoke 用的是代理,其實還有其他的方法,比如 action 和func。執行個體代碼如下:
它适用于需周期性調用的方法,它不在建立計時器的線程中運作,它在由系統自動配置設定的單獨線程中運作。這和win32中的settimer方法類似。它的構造為:
如果 duetime 為0,則 callback 立即執行它的首次調用。如果 duetime 為 infinite,則 callback 不調用它的方法。計時器被禁用,但使用 change 方法可以重新啟用它。如果 period 為0或 infinite,并且 duetime 不為 infinite,則 callback 調用它的方法一次。計時器的定期行為被禁用,但使用 change 方法可以重新啟用它。如果 period 為零 (0) 或 infinite,并且 duetime 不為 infinite,則
callback 調用它的方法一次。計時器的定期行為被禁用,但使用 change 方法可以重新啟用它。
在建立計時器之後若想改變它的period和duetime,我們可以通過調用timer的change方法來改變:
顯然所改變的兩個參數對應于timer中的兩參數。