自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

CLR線(xiàn)程池教程四大功能詳解

開(kāi)發(fā) 后端
CLR線(xiàn)程池教程帶你走進(jìn)CLR的世界,了解基本線(xiàn)程池的概念對(duì)線(xiàn)程池四大功能如異步調(diào)用方法 ,以一定的時(shí)間間隔調(diào)用方法,當(dāng)單個(gè)內(nèi)核對(duì)象得到信號(hào)通知時(shí)調(diào)用方法的詳細(xì)解釋。

在這里你可以學(xué)到Microsoft研究CLR實(shí)現(xiàn)線(xiàn)程池的原理機(jī)制,從而更靈活的處理CLR在實(shí)際代碼應(yīng)中線(xiàn)程池的問(wèn)題,下面我們來(lái)看看吧。

CLR教程之線(xiàn)程池的產(chǎn)生

當(dāng) CLR 初始化時(shí),其線(xiàn)程池中不含有線(xiàn)程。當(dāng)應(yīng)用程序要?jiǎng)?chuàng)建線(xiàn)程來(lái)執(zhí)行任務(wù)時(shí),該應(yīng)用程序應(yīng)請(qǐng)求線(xiàn)程池線(xiàn)程來(lái)執(zhí)行任務(wù)。線(xiàn)程池知道后將創(chuàng)建一個(gè)初始線(xiàn)程。該新線(xiàn)程經(jīng)歷的初始化和其他線(xiàn)程一樣;但是任務(wù)完成后,該線(xiàn)程不會(huì)自行銷(xiāo)毀。相反,它會(huì)以?huà)炱馉顟B(tài)返回線(xiàn)程池。如果應(yīng)用程序再次向線(xiàn)程池發(fā)出請(qǐng)求,那么這個(gè)掛起的線(xiàn)程將激活并執(zhí)行任務(wù),而不會(huì)創(chuàng)建新線(xiàn)程。這節(jié)約了很多開(kāi)銷(xiāo)。只要線(xiàn)程池中應(yīng)用程序任務(wù)的排隊(duì)速度低于一個(gè)線(xiàn)程處理每項(xiàng)任務(wù)的速度,那么就可以反復(fù)重用同一線(xiàn)程,從而在應(yīng)用程序生存期內(nèi)節(jié)約大量開(kāi)銷(xiāo)。

那么,如果線(xiàn)程池中應(yīng)用程序任務(wù)排隊(duì)的速度超過(guò)一個(gè)線(xiàn)程處理任務(wù)的速度,則線(xiàn)程池將創(chuàng)建額外的線(xiàn)程。當(dāng)然,創(chuàng)建新線(xiàn)程確實(shí)會(huì)產(chǎn)生額外開(kāi)銷(xiāo),但應(yīng)用程序在其生存期中很可能只請(qǐng)求幾個(gè)線(xiàn)程來(lái)處理交給它的所有任務(wù)。因此,總體來(lái)說(shuō),通過(guò)使用線(xiàn)程池可以提高應(yīng)用程序的性能。線(xiàn)程池的一個(gè)絕妙特性是:它是啟發(fā)式的。如果您的應(yīng)用程序需要執(zhí)行很多任務(wù),那么線(xiàn)程池將創(chuàng)建更多的線(xiàn)程。如果您的應(yīng)用程序的工作負(fù)載逐漸減少,那么線(xiàn)程池線(xiàn)程將自行終止。線(xiàn)程池的算法確保它僅包含置于其上的工作負(fù)荷所需要的線(xiàn)程數(shù)!

因此,希望您現(xiàn)在已理解了線(xiàn)程池的基本概念,并明白了它所能提供的性能優(yōu)勢(shì)?,F(xiàn)在我將給出一些代碼來(lái)說(shuō)明如何使用線(xiàn)程池。首先,您應(yīng)該知道線(xiàn)程池可以提供四種功能:
◆異步調(diào)用方法
◆以一定的時(shí)間間隔調(diào)用方法
◆當(dāng)單個(gè)內(nèi)核對(duì)象得到信號(hào)通知時(shí)調(diào)用方法
◆當(dāng)異步 I/O 請(qǐng)求結(jié)束時(shí)調(diào)用方法
 
前三種功能非常有用,我將在本專(zhuān)欄中加以說(shuō)明。而應(yīng)用程序開(kāi)發(fā)人員很少使用第四種功能,因此在此我將不做說(shuō)明;有可能在將來(lái)的專(zhuān)欄中講到。

功能 1:CLR線(xiàn)程池教程之異步調(diào)用方法

在您的應(yīng)用程序中,如果有創(chuàng)建新線(xiàn)程來(lái)執(zhí)行任務(wù)的代碼,那么我建議您用命令線(xiàn)程池執(zhí)行該任務(wù)的新代碼來(lái)替換它。事實(shí)上,您通常會(huì)發(fā)現(xiàn),讓線(xiàn)程池執(zhí)行任務(wù)比讓一個(gè)新的專(zhuān)用線(xiàn)程來(lái)執(zhí)行任務(wù)更容易。要排隊(duì)線(xiàn)程池任務(wù),您可以使用 System.Threading 命名空間中定義的 ThreadPool 類(lèi)。ThreadPool 類(lèi)只提供靜態(tài)方法,且不能構(gòu)造它的實(shí)例。要讓線(xiàn)程池線(xiàn)程異步調(diào)用方法,您的代碼必須調(diào)用一個(gè) ThreadPool 的重載 QueueUserWorkItem 方法,如下所示:

  1. public static Boolean QueueUserWorkItem(WaitCallback wc, Object state);  
  2. public static Boolean QueueUserWorkItem(WaitCallback wc);  

 這些方法將“工作項(xiàng)”(和可選狀態(tài)數(shù)據(jù))排隊(duì)到線(xiàn)程池的線(xiàn)程中,并立即返回。工作項(xiàng)只是一種方法(由 wc 參數(shù)標(biāo)識(shí)),它被調(diào)用并傳遞給單個(gè)參數(shù),即狀態(tài)(狀態(tài)數(shù)據(jù))。沒(méi)有狀態(tài)參數(shù)的 QueueUserWorkItem 版本將 null 傳遞給回調(diào)方法。***,池中的某些線(xiàn)程將調(diào)用您的方法來(lái)處理該工作項(xiàng)。您編寫(xiě)的回調(diào)方法必須與 System.Threading.WaitCallback 委托類(lèi)型相匹配,其定義如下:

  1. public delegate void WaitCallback(Object state); 

功能 2:CLR線(xiàn)程池教程之以一定的時(shí)間間隔調(diào)用方法

如果您的應(yīng)用程序需要在某一時(shí)間執(zhí)行某項(xiàng)任務(wù),或者您的應(yīng)用程序需要定期執(zhí)行某些方法,那么使用線(xiàn)程池將是您的***選擇。System.Threading 命名空間定義 Timer 類(lèi)。當(dāng)您構(gòu)造 Timer 類(lèi)的實(shí)例時(shí),您是在告訴線(xiàn)程池您想在將來(lái)的某個(gè)特定時(shí)間回調(diào)自己的某個(gè)方法。Timer 類(lèi)有四種構(gòu)造函數(shù):

  1. public Timer(TimerCallback callback, Object state,  
  2. Int32 dueTime, Int32 period);  
  3. public Timer(TimerCallback callback, Object state,  
  4. UInt32 dueTime, UInt32 period);  
  5. public Timer(TimerCallback callback, Object state,  
  6. Int64 dueTime, Int64 period);  
  7. public Timer(TimerCallback callback, Object state,  
  8. Timespan dueTime, TimeSpan period);   

所有這四種構(gòu)造函數(shù)構(gòu)造完全相同的 Timer 對(duì)象?;卣{(diào)參數(shù)標(biāo)識(shí)您想由線(xiàn)程池線(xiàn)程回調(diào)的方法。當(dāng)然,您編寫(xiě)的回調(diào)方法必須與 System.Threading.TimerCallback 委托類(lèi)型相匹配,其定義如下:

  1. public delegate void TimerCallback(Object state); 

構(gòu)造 Timer 對(duì)象后,線(xiàn)程池知道要做什么,并自動(dòng)為您監(jiān)視時(shí)間。然而,Timer 類(lèi)還提供了幾種其他的方法,允許您與線(xiàn)程池進(jìn)行通信,以便更改什么時(shí)候(或者是否)應(yīng)當(dāng)回調(diào)方法。具體地說(shuō),Timer 類(lèi)提供了幾種 Change 和 Dispose 方法:

  1. public Boolean Change(Int32    dueTime, Int32    period);  
  2. public Boolean Change(UInt32   dueTime, UInt32   period);  
  3. public Boolean Change(Int64    dueTime, Int64    period);  
  4. public Boolean Change(TimeSpan dueTime, TimeSpan period);   
  5. public Boolean Dispose();  
  6. public Boolean Dispose(WaitHandle notifyObject);  

 Change 方法允許您更改 Timer 對(duì)象的 dueTime 和 period。Dispose 方法允許您在所有掛起的回調(diào)已經(jīng)完成的時(shí)候,完全取消回調(diào),并可選地用信號(hào)通知由 notifyObject 參數(shù)標(biāo)識(shí)的內(nèi)核對(duì)象。#p#

功能 3:CLR線(xiàn)程池教程之當(dāng)單個(gè)內(nèi)核對(duì)象得到信號(hào)通知時(shí)調(diào)用方法

要讓線(xiàn)程池線(xiàn)程在內(nèi)核對(duì)象得到信號(hào)通知時(shí)調(diào)用您的回調(diào)方法,您可以再次利用 System.Threading.ThreadPool 類(lèi)中定義的一些靜態(tài)方法。要讓線(xiàn)程池線(xiàn)程在內(nèi)核對(duì)象得到信號(hào)通知時(shí)調(diào)用方法,您的代碼必須調(diào)用一個(gè)重載的 RegisterWaitHandle 方法,當(dāng)您調(diào)用這些方法之一時(shí),h 參數(shù)標(biāo)識(shí)出您想要線(xiàn)程池等待的內(nèi)核對(duì)象。由于該參數(shù)是抽象基類(lèi) System.Threading.WaitHandle,因此您可以指定從該基類(lèi)派生出來(lái)的任何類(lèi)。特別地,您可以將一個(gè)引用傳遞給 AutoResetEvent、ManualResetEvent 或 Mutex object。第二個(gè)參數(shù) callback 標(biāo)識(shí)出您想要線(xiàn)程池線(xiàn)程調(diào)用的方法。您實(shí)現(xiàn)的回調(diào)方法必須與 System.Threading.WaitOrTimerCallback 委托類(lèi)型相匹配,其定義如下列代碼行所示:

  1. public delegate void WaitOrTimerCallback(Object state,  
  2. Boolean timedOut); 

第三個(gè)參數(shù) state 允許您指定應(yīng)傳遞給回調(diào)方法的某些狀態(tài)數(shù)據(jù),如果沒(méi)有特別的狀態(tài)數(shù)據(jù)要傳遞,則傳遞 null。第四個(gè)參數(shù) milliseconds 允許您告訴線(xiàn)程池內(nèi)核對(duì)象得到信號(hào)通知前應(yīng)該等待的時(shí)間。這里通常傳遞 -1,以表示無(wú)限超時(shí)。如果***一個(gè)參數(shù) executeOnlyOnce 為真,那么線(xiàn)程池線(xiàn)程將僅執(zhí)行回調(diào)方法一次。但是,如果 executeOnlyOnce 為假,那么線(xiàn)程池線(xiàn)程將在內(nèi)核對(duì)象每次得到信號(hào)通知時(shí)執(zhí)行回調(diào)方法。這對(duì) AutoResetEvent 對(duì)象非常有用。

在前面所示的原型中,您會(huì)注意到 RegisterWaitForSingleObject 方法返回一個(gè) RegisteredWaitHandle 對(duì)象。該對(duì)象確定線(xiàn)程池在等待的內(nèi)核對(duì)象。如果由于某種原因,您的應(yīng)用程序要告訴線(xiàn)程池停止監(jiān)視已注冊(cè)的等待句柄,那么您的應(yīng)用程序就可以調(diào)用 RegisteredWaitHandle 的 Unregister 方法:

  1. public Boolean Unregister(WaitHandle waitObject); 

waitObject 參數(shù)表明當(dāng)執(zhí)行完隊(duì)列中的所有工作項(xiàng)后,您想如何得到信號(hào)通知。如果不想得到信號(hào)通知,那么您應(yīng)將 null 傳遞給該參數(shù)。如果您將一個(gè)有效引用傳遞給 WaitHandle-derived 對(duì)象,那么線(xiàn)程池會(huì)在已注冊(cè)等待句柄的所有掛起工作項(xiàng)執(zhí)行完后,通知該對(duì)象。

小結(jié)

在本專(zhuān)欄中,我講述了對(duì)線(xiàn)程池的需要,說(shuō)明了如何利用 CLR 線(xiàn)程池提供的各種功能?,F(xiàn)在您應(yīng)該明白線(xiàn)程池為您的開(kāi)發(fā)所帶來(lái)的價(jià)值,它可以提高您的應(yīng)用程序的性能,并簡(jiǎn)化您的代碼。

【編輯推薦】

  1. 深入了解.NET編譯器中CLR加載過(guò)程
  2. 詳解CLR中Jit編譯發(fā)生的過(guò)程
  3. 經(jīng)典講解 CLR是什么?
  4. 為你解疑:CLR是什么?
  5. 3G與IPTV是發(fā)展大方向
責(zé)任編輯:田樹(shù) 來(lái)源: 博客
相關(guān)推薦

2009-09-18 12:35:01

Red Hat紅帽linux

2012-10-19 16:18:42

Exchange

2012-03-02 09:21:22

服務(wù)器虛擬化

2012-07-27 14:45:12

傲游瀏覽器傲游瀏覽器

2021-09-27 22:29:39

iOS微信系統(tǒng)

2009-07-16 15:41:58

2011-10-17 11:30:27

惠普復(fù)合一體機(jī)

2010-11-23 13:33:49

Windows Ser數(shù)據(jù)中心

2014-09-25 13:12:47

微信企業(yè)號(hào)功能體系

2011-04-06 15:08:19

2018-09-28 05:07:47

物聯(lián)網(wǎng)聯(lián)網(wǎng)平臺(tái)IOT

2012-08-10 10:59:18

IP-guard信息泄露信息防泄露

2012-06-04 15:34:22

聯(lián)想復(fù)合一體機(jī)

2020-02-03 12:46:11

分布式跟蹤分布式跟蹤系統(tǒng)系統(tǒng)架構(gòu)

2010-04-26 12:22:03

Unix系統(tǒng)功能

2010-07-19 10:05:07

jQuery

2010-08-05 10:22:46

Flex效果

2012-10-09 09:30:06

Linux

2015-07-17 09:50:16

Carthage優(yōu)劣比較

2010-07-02 14:34:53

UML類(lèi)圖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)