.NET多線程編程(4):線程池和異步編程
2007/1/5 17:40:10
如果你仔細(xì)閱讀了我前面的三篇文章,我相信你對用.NET Framework提供的System.Threading.Thread類和一些線程同步的類基本的線程知識和多線程編程知識很了解。我們將在這里進(jìn)一步討論一些.NET類,以及他們在多線程編程中扮演的角色和怎么編程。它們是:
System.Threading.ThreadPool 類
System.Threading.Timer 類
如果線程的數(shù)目并不是很多,而且你想控制每個線程的細(xì)節(jié)諸如線程的優(yōu)先級等,使用Thread是比較合適的;但是如果有大量的線程,考慮使用線程池應(yīng)該更好一些,它提供了高效的線程管理機制來處理多任務(wù)。 對于定期的執(zhí)行任務(wù)Timer類是合適的;使用代表是異步方法調(diào)用的首選。
System.Threading.ThreadPool Class
當(dāng)你創(chuàng)建應(yīng)用程序時,你應(yīng)該認(rèn)識到大部分時間你的線程在空閑的等待某些事件的發(fā)生(諸如按下一個鍵或偵聽套節(jié)子的請求)。毫無疑問的,你也會認(rèn)為這是絕對的浪費資源。
如果這里有很多的任務(wù)需要完成,每個任務(wù)需要一個線程,你應(yīng)該考慮使用線程池來更有效的管理你的資源并且從中受益。線程池是執(zhí)行的多個線程集合,它允許你添加以線程自動創(chuàng)建和開始的任務(wù)到隊列里面去。使用線程池使得你的系統(tǒng)可以優(yōu)化線程在CPU使用時的時間碎片。但是要記住在任何特定的時間點,每一個進(jìn)程和每個線程池只有一個一個正在運行的線程。這個類使得你的線程組成的池可以被系統(tǒng)管理,而使你的主要精力集中在工作流的邏輯而不是線程的管理。
當(dāng)?shù)谝淮螌嵗疶hreadPool類時線程池將被創(chuàng)建。它有一個默認(rèn)的上限,即每處理器最多可以有25個,但是這個上限是可以改變的。這樣使得處理器不會閑置下來。如果其中一個線程等待某個事件的發(fā)生,線程池將初始化另外一個線程并投入處理器工作,線程池就是這樣不停的創(chuàng)建工作的線程和分配任務(wù)給那些沒有工作的在隊列里的線程。唯一的限制是工作線程的數(shù)目不能超過最大允許的數(shù)目。每個線程將運行在默認(rèn)的優(yōu)先級和使用默認(rèn)的屬于多線程空間的堆棧大小空間。一旦一項工作任務(wù)被加入隊列,你是不能取消的。
請求線程池處理一個任務(wù)或者工作項可以調(diào)用QueueUserWorkItem方法。這個方法帶一個WaitCallback代表類型的參數(shù),這個參數(shù)包裝了你藥完成的任務(wù)。運行時自動為每一個的任務(wù)創(chuàng)建線程并且在任務(wù)釋放時釋放線程。
下面的代碼說明了如何創(chuàng)建線程池和怎樣添加任務(wù):
public void afunction(object o)
{
// do what ever the function is supposed to do.
}
//thread entry code
{
// create an instance of WaitCallback
WaitCallback myCallback = new WaitCallback (afunction);
//add this to the thread pool / queue a task
ThreadPool.QueueUserWorkItem (myCallback);
}
你也可以通過調(diào)用ThreadPool.RegisterWaitForSingleObject方法來傳遞一個System.Threading.WaitHandle,當(dāng)被通知或者時間超過了調(diào)用被System.Threading.WaitOrTimerCallback包裝的方法。
線程池和基于事件的編程模式使得線程池對注冊的WaitHandles的監(jiān)控和對合適的WaitOrTimerCallback代表方法的調(diào)用十分簡單(當(dāng)WaitHandle被釋放時)。這些做法其實很簡單。這里有一個線程不斷的觀測在線程池隊列等待操作的狀態(tài)。一旦等待操作完成,一個線程將被執(zhí)行與其對應(yīng)的任務(wù)。因此,這個方法隨著出發(fā)觸發(fā)事件的發(fā)生而增加一個線程。
讓我們看看怎么隨事件添加一個線程到線程池,其實很簡單。我們只需要創(chuàng)建一個ManualResetEvent類的事件和一個WaitOrTimerCallback的代表,然后我們需要一個攜帶代表狀態(tài)的對象,同時我們也要決定休息間隔和執(zhí)行方式。我們將上面的都添加到線程池,并且激發(fā)一個事件:
public void afunction(object o)
{
// do what ever the function is supposed to do.
}
//object tha
下一頁
返回列表
返回首頁
主站蜘蛛池模板:
欧美精品色婷婷五月综合|
香港黄色碟片黄色碟片|
妺妺窝人体色WWW在线观看|
久久人人爽人人爽人人片AV东京热
|
亚洲丁香婷婷综合久久|
深夜A级毛片视频免费|
午夜精品不卡电影在线观看|
韩国18福利视频免费观看
|
国产极品粉嫩交性大片|
91制片厂在线播放|
天堂√最新版中文在线|
一道本在线免费视频|
日日摸日日碰人妻无码|
久久精品国产精品青草|
欧美三级中文字幕在线观看|
亚洲熟妇少妇任你躁在线观看
|
亚洲自偷精品视频自拍|
精品国产AV色欲果冻传媒|
国产一区二区在线观看麻豆|
高清伦理电影在线看|
国产精品一区二区av|
777四色米奇欧美影院|
在线观看福利网站|
www.tube8.com日本|
情欲小说app下载|
久久99热国产这有精品|
日本精品久久久久中文字幕|
久草网在线视频|
最近更新中文字幕影视|
亚洲制服丝袜中文字幕|
欧美熟妇另类久久久久久多毛|
人妻精品久久久久中文字幕一冢本|
精品亚洲一区二区|
午夜精品一区二区三区在线观看|
腿打开一下一会就不疼了|
国产乱妇乱子在线视频|
青娱乐在线免费观看视频|
国产在线98福利播放视频免费|
国产v亚洲v天堂a无|
国产日韩精品中文字无码|
亚洲偷自精品三十六区|