.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无| 国产日韩精品中文字无码| 亚洲偷自精品三十六区|