青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

C++ Programmer's Cookbook

{C++ 基礎(chǔ)} {C++ 高級(jí)} {C#界面,C++核心算法} {設(shè)計(jì)模式} {C#基礎(chǔ)}

c# Thread 高級(jí)使用

System.Threading.ThreadPool 類(lèi)

  System.Threading.Timer 類(lèi)

  如果線程的數(shù)目并不是很多,而且你想控制每個(gè)線程的細(xì)節(jié)諸如線程的優(yōu)先級(jí)等,使用Thread是比較合適的;但是如果有大量的線程,考慮使用線程池應(yīng)該更好一些,它提供了高效的線程管理機(jī)制來(lái)處理多任務(wù)。 對(duì)于定期的執(zhí)行任務(wù)Timer類(lèi)是合適的;使用代表是異步方法調(diào)用的首選。

System.Threading.ThreadPool Class

  當(dāng)你創(chuàng)建應(yīng)用程序時(shí),你應(yīng)該認(rèn)識(shí)到大部分時(shí)間你的線程在空閑的等待某些事件的發(fā)生(諸如按下一個(gè)鍵或偵聽(tīng)套節(jié)子的請(qǐng)求)。毫無(wú)疑問(wèn)的,你也會(huì)認(rèn)為這是絕對(duì)的浪費(fèi)資源。

  如果這里有很多的任務(wù)需要完成,每個(gè)任務(wù)需要一個(gè)線程,你應(yīng)該考慮使用線程池來(lái)更有效的管理你的資源并且從中受益。線程池是執(zhí)行的多個(gè)線程集合,它允許你添加以線程自動(dòng)創(chuàng)建和開(kāi)始的任務(wù)到隊(duì)列里面去。使用線程池使得你的系統(tǒng)可以?xún)?yōu)化線程在CPU使用時(shí)的時(shí)間碎片。但是要記住在任何特定的時(shí)間點(diǎn),每一個(gè)進(jìn)程和每個(gè)線程池只有一個(gè)一個(gè)正在運(yùn)行的線程。這個(gè)類(lèi)使得你的線程組成的池可以被系統(tǒng)管理,而使你的主要精力集中在工作流的邏輯而不是線程的管理。

  當(dāng)?shù)谝淮螌?shí)例化ThreadPool類(lèi)時(shí)線程池將被創(chuàng)建。它有一個(gè)默認(rèn)的上限,即每處理器最多可以有25個(gè),但是這個(gè)上限是可以改變的。這樣使得處理器不會(huì)閑置下來(lái)。如果其中一個(gè)線程等待某個(gè)事件的發(fā)生,線程池將初始化另外一個(gè)線程并投入處理器工作,線程池就是這樣不停的創(chuàng)建工作的線程和分配任務(wù)給那些沒(méi)有工作的在隊(duì)列里的線程。唯一的限制是工作線程的數(shù)目不能超過(guò)最大允許的數(shù)目。每個(gè)線程將運(yùn)行在默認(rèn)的優(yōu)先級(jí)和使用默認(rèn)的屬于多線程空間的堆棧大小空間。一旦一項(xiàng)工作任務(wù)被加入隊(duì)列,你是不能取消的。

  請(qǐng)求線程池處理一個(gè)任務(wù)或者工作項(xiàng)可以調(diào)用QueueUserWorkItem方法。這個(gè)方法帶一個(gè)WaitCallback代表類(lèi)型的參數(shù),這個(gè)參數(shù)包裝了你藥完成的任務(wù)。運(yùn)行時(shí)自動(dòng)為每一個(gè)的任務(wù)創(chuàng)建線程并且在任務(wù)釋放時(shí)釋放線程。

  下面的代碼說(shuō)明了如何創(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);?

}



  你也可以通過(guò)調(diào)用ThreadPool.RegisterWaitForSingleObject方法來(lái)傳遞一個(gè)System.Threading.WaitHandle,當(dāng)被通知或者時(shí)間超過(guò)了調(diào)用被System.Threading.WaitOrTimerCallback包裝的方法。

  線程池和基于事件的編程模式使得線程池對(duì)注冊(cè)的WaitHandles的監(jiān)控和對(duì)合適的WaitOrTimerCallback代表方法的調(diào)用十分簡(jiǎn)單(當(dāng)WaitHandle被釋放時(shí))。這些做法其實(shí)很簡(jiǎn)單。這里有一個(gè)線程不斷的觀測(cè)在線程池隊(duì)列等待操作的狀態(tài)。一旦等待操作完成,一個(gè)線程將被執(zhí)行與其對(duì)應(yīng)的任務(wù)。因此,這個(gè)方法隨著出發(fā)觸發(fā)事件的發(fā)生而增加一個(gè)線程。

  讓我們看看怎么隨事件添加一個(gè)線程到線程池,其實(shí)很簡(jiǎn)單。我們只需要?jiǎng)?chuàng)建一個(gè)ManualResetEvent類(lèi)的事件和一個(gè)WaitOrTimerCallback的代表,然后我們需要一個(gè)攜帶代表狀態(tài)的對(duì)象,同時(shí)我們也要決定休息間隔和執(zhí)行方式。我們將上面的都添加到線程池,并且激發(fā)一個(gè)事件:

public?void?afunction(object?o)?

{?

//?do?what?ever?the?function?is?supposed?to?do.?

}
?


//object?that?will?carry?the?status?information

public?class?anObject?

{?

}
?

//thread?entry?code?

{?

//create?an?event?object

ManualResetEvent?aevent?
=?new?ManualResetEvent?(false);?


//?create?an?instance?of?WaitOrTimerCallback?

WaitOrTimerCallback?thread_method?
=?new?WaitOrTimerCallback?(afunction);?


//?create?an?instance?of?anObject?

anObject?myobj?
=?new?anObject();?


//?decide?how?thread?will?perform?

int?timeout_interval?=?100;?//?timeout?in?milli-seconds.?

bool?onetime_exec?=?true;?


//add?all?this?to?the?thread?pool.?

ThreadPool.?RegisterWaitForSingleObject?(aevent,?thread_method,?myobj,?timeout_interval,?onetime_exec);?


//?raise?the?event?

aevent.Set();?

}



  在QueueUserWorkItem和RegisterWaitForSingleObject方法中,線程池創(chuàng)建了一個(gè)后臺(tái)的線程來(lái)回調(diào)。當(dāng)線程池開(kāi)始執(zhí)行一個(gè)任務(wù),兩個(gè)方法都將調(diào)用者的堆棧合并到線程池的線程堆棧中。如果需要安全檢查將耗費(fèi)更多的時(shí)間和增加系統(tǒng)的負(fù)擔(dān),因此可以通過(guò)使用它們對(duì)應(yīng)的不安全的方法來(lái)避免安全檢查。就是ThreadPool.UnsafeRegisterWaitForSingleObject 和ThreadPool.UnsafeQueueUserWorkItem。

  你也可以對(duì)與等待操作無(wú)關(guān)的任務(wù)排隊(duì)。 Timer-queue timers and registered wait operations也使用線程池。它們的返回方法也被放入線程池排隊(duì)。

  線程池是非常有用的,被廣泛的用于。NET平臺(tái)上的套節(jié)子編程,等待操作注冊(cè),進(jìn)程計(jì)時(shí)器和異步的I/O。對(duì)于小而短的任務(wù),線程池提供的機(jī)制也是十分便利處于多線程的。線程池對(duì)于完成許多獨(dú)立的任務(wù)而且不需要逐個(gè)的設(shè)置線程屬性是十分便利的。但是,你也應(yīng)該很清楚,有很多的情況是可以用其他的方法來(lái)替代線程池的。比如說(shuō)你的計(jì)劃任務(wù)或給每個(gè)線程特定的屬性,或者你需要將線程放入單個(gè)線程的空間(而線程池是將所有的線程放入一個(gè)多線程空間),抑或是一個(gè)特定的任務(wù)是很冗長(zhǎng)的,這些情況你最好考慮清楚,安全的辦法比用線程池應(yīng)該是你的選擇。


System.Threading.Timer Class

  Timer類(lèi)對(duì)于周期性的在分離的線程執(zhí)行任務(wù)是非常有效的,它不能被繼承。

  這個(gè)類(lèi)尤其用來(lái)開(kāi)發(fā)控制臺(tái)應(yīng)用程序,因?yàn)镾ystem.Windows.Forms.Time是不可用的。比如同來(lái)備份文件和檢查數(shù)據(jù)庫(kù)的一致性。

  當(dāng)創(chuàng)建Timer對(duì)象時(shí),你藥估計(jì)在第一個(gè)代理調(diào)用之前等待的時(shí)間和后來(lái)的每次成功調(diào)用之間的時(shí)間。一個(gè)定時(shí)調(diào)用發(fā)生在方法的應(yīng)得時(shí)間過(guò)去,并且在后來(lái)周期性的調(diào)用這個(gè)方法。你可以適應(yīng)Timer的Change方法來(lái)改變這些設(shè)置的值或者使Timer失效。當(dāng)定時(shí)器Timer不再使用時(shí),你應(yīng)該調(diào)用Dispose方法來(lái)釋放其資源。

  TimerCallback代表負(fù)責(zé)指定與Timer對(duì)象相關(guān)聯(lián)的方法(就是要周期執(zhí)行的任務(wù))和狀態(tài)。它在方法應(yīng)得的時(shí)間過(guò)去之后調(diào)用一次并且周期性的調(diào)用這個(gè)方法直到調(diào)用了Dispose方法釋放了Timer的所有資源。系統(tǒng)自動(dòng)分配分離的線程。

  讓我們來(lái)看一段代碼看看事如何創(chuàng)建Timer對(duì)象和使用它的。我們首先要?jiǎng)?chuàng)建一個(gè)TimerCallback代理,在后面的方法中要使用到的。如果需要,下一步我們要?jiǎng)?chuàng)建一個(gè)狀態(tài)對(duì)象,它擁有與被代理調(diào)用的方法相關(guān)聯(lián)的特定信息。為了使這些簡(jiǎn)單一些,我們傳遞一個(gè)空參數(shù)。我們將實(shí)例化一個(gè)Timer對(duì)象,然后再使用Change方法改變Timer的設(shè)置,最后調(diào)用Dispose方法釋放資源。

//?class?that?will?be?called?by?the?Timer?

public?class?WorkonTimerReq?

{?

public?void?aTimerCallMethod()?

{?

//?does?some?work

}
?

}
?


//timer?creation?block?

{?

//instantiating?the?class?that?gets?called?by?the?Timer.?

WorkonTimerReq?anObj?
=?new?WorkonTimerReq?()?;?


//?callback?delegate?

TimerCallback?tcallback?
=?new?TimerCallback(anObj.?aTimerCallMethod)?;?


//?define?the?dueTime?and?period?

long?dTime?=?20?;?//?wait?before?the?first?tick?(in?ms)?

long?pTime?=?150?;?//?timer?during?subsequent?invocations?(in?ms)?


//?instantiate?the?Timer?object?

Timer?atimer?
=?new?Timer(tcallback,?null,?dTime,?pTime)?;?


//?do?some?thing?with?the?timer?object?

?

//change?the?dueTime?and?period?of?the?Timer?

dTime
=100;?

pTime
=300;?

atimer.Change(dTime,?pTime)?;?

//?do?some?thing?

?

atimer.Dispose()?;?

?

}




異步編程

  這部分內(nèi)容如果要講清楚本來(lái)就是很大的一部分,在這里,我不打算詳細(xì)討論這個(gè)東西,我們只是需要直到它是什么,因?yàn)槎嗑€程編程如果忽律異步的多線程編程顯然是不應(yīng)該的。異步的多線程編程是你的程序可能會(huì)用到的另外一種多線程編程方法。

  在前面的文章我們花了很大的篇幅來(lái)介紹線程的同步和怎么實(shí)現(xiàn)線程的同步,但是它有一個(gè)固有的致命的缺點(diǎn),你或許注意到了這一點(diǎn)。那就是每個(gè)線程必須作同步調(diào)用,也就是等到其他的功能完成,否則就阻塞。當(dāng)然,某些情況下,對(duì)于那些邏輯上相互依賴(lài)的任務(wù)來(lái)說(shuō)是足夠的。異步編程允許更加復(fù)雜的靈活性。一個(gè)線程可以作異步調(diào)用,不需要等待其他的東西。你可以使用這些線程作任何的任務(wù),線程負(fù)責(zé)獲取結(jié)果推進(jìn)運(yùn)行。這給予了那些需要管理數(shù)目巨大的請(qǐng)求而且負(fù)擔(dān)不起請(qǐng)求等待代價(jià)的企業(yè)級(jí)的系統(tǒng)更好的可伸縮性。

posted on 2006-04-20 19:23 夢(mèng)在天涯 閱讀(3676) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): C#/.NET

公告

EMail:itech001#126.com

導(dǎo)航

統(tǒng)計(jì)

  • 隨筆 - 461
  • 文章 - 4
  • 評(píng)論 - 746
  • 引用 - 0

常用鏈接

隨筆分類(lèi)

隨筆檔案

收藏夾

Blogs

c#(csharp)

C++(cpp)

Enlish

Forums(bbs)

My self

Often go

Useful Webs

Xml/Uml/html

搜索

  •  

積分與排名

  • 積分 - 1816190
  • 排名 - 5

最新評(píng)論

閱讀排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
      <noscript id="pjuwb"></noscript>
            <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
              <dd id="pjuwb"></dd>
              <abbr id="pjuwb"></abbr>
              狠狠色狠狠色综合日日五| 国产亚洲欧美日韩精品| 新片速递亚洲合集欧美合集| 亚洲欧美99| 久久青草久久| 亚洲精品三级| 欧美日韩伦理在线| 香蕉久久国产| 久久久久欧美精品| 日韩亚洲成人av在线| 一本一本大道香蕉久在线精品| 国产精品分类| 老司机精品福利视频| 欧美大片第1页| 中文久久乱码一区二区| 亚洲调教视频在线观看| 国内久久婷婷综合| 亚洲国产精品久久久久婷婷老年 | 欧美mv日韩mv国产网站| 亚洲调教视频在线观看| 羞羞答答国产精品www一本| 亚洲国产精品www| 日韩一级精品| 国产一区二区精品久久| 亚洲国产成人av| 国产精品视频大全| 久久久夜色精品亚洲| 欧美精品播放| 久久国产视频网| 欧美高清一区二区| 亚洲精品久久久久中文字幕欢迎你 | 国产欧美一区二区在线观看| 米奇777在线欧美播放| 欧美日韩国产天堂| 久久偷看各类wc女厕嘘嘘偷窃| 欧美国产综合| 久久精品成人| 欧美激情一区| 久久大香伊蕉在人线观看热2| 欧美成人午夜免费视在线看片| 性欧美激情精品| 欧美高清在线一区二区| 久久国产乱子精品免费女| 欧美激情视频在线播放| 久久久国产成人精品| 欧美日韩国产一区二区| 老**午夜毛片一区二区三区| 国产精品久久久一区二区| 另类亚洲自拍| 国产精品一区=区| 91久久夜色精品国产九色| 国内精品**久久毛片app| 一区二区激情小说| 亚洲激情网站| 欧美在线免费观看| 亚洲一二三四区| 欧美在线二区| 亚洲午夜久久久久久久久电影院| 久久免费偷拍视频| 午夜亚洲性色视频| 欧美日韩一区在线视频| 猫咪成人在线观看| 欧美黑人在线播放| 韩国精品一区二区三区| 亚洲国产经典视频| 国产女人水真多18毛片18精品视频| 欧美激情一区二区三区| 国产日韩1区| 亚洲无玛一区| 亚洲黄色在线观看| 久久精品国产69国产精品亚洲| 一本色道久久综合亚洲精品高清| 另类av导航| 久久精品三级| 国产精品你懂的| 亚洲国产精品va在看黑人| 伊人久久婷婷色综合98网| 亚洲视频精品在线| 一本色道久久综合亚洲精品不卡| 久久夜色精品一区| 久久美女性网| 国产精品视频免费一区| 91久久国产精品91久久性色| 依依成人综合视频| 亚洲精品少妇30p| 日韩视频免费大全中文字幕| 欧美在线一二三区| 久久久久国产一区二区| 亚洲一区在线观看免费观看电影高清| 国产一区二区三区免费不卡 | 久久国产精品亚洲va麻豆| 欧美日韩99| 欧美国产日韩一区二区三区| 黑人巨大精品欧美一区二区| 亚洲午夜av在线| 亚洲欧美视频在线观看| 欧美日韩在线不卡一区| 夜夜嗨av一区二区三区免费区| 久久最新视频| 亚洲国产高清视频| 欧美在线free| 老司机久久99久久精品播放免费| 欧美午夜精品久久久久久人妖 | 国产日韩精品久久久| 亚洲一区二区在线播放| 99re6热在线精品视频播放速度| 欧美国产先锋| 亚洲国产精品久久久久| 99视频精品免费观看| 欧美国产一区二区在线观看 | 欧美日本不卡高清| 亚洲精品123区| 在线综合亚洲欧美在线视频| 欧美精品久久99久久在免费线| 亚洲日韩第九十九页| 亚洲精品日韩精品| 欧美日韩福利| 亚洲精品国产日韩| 亚洲婷婷在线| 欧美午夜宅男影院在线观看| 国产欧美在线看| 久久成人免费视频| 在线一区日本视频| 欧美四级在线| 亚洲欧美日韩精品久久久久| 亚洲一区图片| 国产亚洲精品aa| 久久www成人_看片免费不卡| 老鸭窝毛片一区二区三区| 国产专区一区| 嫩草国产精品入口| 亚洲精品123区| 亚洲欧美日韩天堂| 国产婷婷色综合av蜜臀av| 久久精品国产一区二区三| 免费观看成人鲁鲁鲁鲁鲁视频| 黄色成人在线观看| 美国成人直播| 亚洲片在线资源| 亚洲一区网站| 尤物九九久久国产精品的分类| 亚洲欧洲日本专区| 日韩视频精品| 激情综合在线| 一本久久综合亚洲鲁鲁五月天| 亚洲欧美激情视频| 国产原创一区二区| 久久精品国产综合精品| 亚洲人成网在线播放| 亚洲乱码精品一二三四区日韩在线 | 亚洲欧美日韩一区二区在线 | 亚洲精品乱码久久久久久久久| 国产精品拍天天在线| 亚洲欧美日韩国产综合在线| 欧美黄色一级视频| 亚洲天堂av综合网| 国内精品久久久久久久97牛牛| 蜜臀久久99精品久久久久久9| 一区二区三区 在线观看视| 欧美主播一区二区三区| 亚洲精品一区二区三区四区高清| 欧美美女操人视频| 性伦欧美刺激片在线观看| 女主播福利一区| 一本综合精品| 一区二区亚洲精品| 欧美日精品一区视频| 午夜精品福利在线观看| 久久综合给合| 正在播放亚洲| 今天的高清视频免费播放成人| 欧美精品123区| 久久九九99视频| 99国产精品99久久久久久| 免费看av成人| 亚洲深夜激情| 亚洲国产午夜| 国产精品色婷婷| 欧美激情综合在线| 欧美一区二区大片| 亚洲精品美女在线观看播放| 久久九九国产精品怡红院| 99在线精品视频在线观看| 一区精品在线| 国产精品国产一区二区| 麻豆成人在线| 亚洲在线免费视频| 亚洲国产精品精华液2区45| 午夜日韩在线观看| 在线视频精品一| 国内精品写真在线观看| 国产精品日产欧美久久久久| 美女视频黄 久久| 黑人极品videos精品欧美裸| 欧美99在线视频观看| 99热这里只有精品8| 国产日韩精品一区二区三区在线| 久久蜜臀精品av| 欧美一级淫片播放口| 亚洲欧洲精品一区二区|