C#語言課件 第11章 多線程編程_第1頁
C#語言課件 第11章 多線程編程_第2頁
C#語言課件 第11章 多線程編程_第3頁
C#語言課件 第11章 多線程編程_第4頁
C#語言課件 第11章 多線程編程_第5頁
已閱讀5頁,還剩21頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第11章多線程編程01線程概述02線程的基本操作03線程同步04線程池和定時器05互斥對象——Mutex1

線程概述主要內(nèi)容

多線程工作方式

何時使用多線程0102多線程工作方式

線程是進(jìn)程中可以并行執(zhí)行的程序段,它可以獨(dú)立占用處理器時間片,同一個進(jìn)程中的線程可以共用進(jìn)程分配的資源和空間。多線程的應(yīng)用程序可以在“同一時刻”處理多項(xiàng)任務(wù)。

默認(rèn)情況下,系統(tǒng)為應(yīng)用程序分配一個主線程,該線程執(zhí)行程序中以Main方法開始和結(jié)束的代碼。[STAThread]staticvoidMain(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false); Application.Run(newForm1());}何時使用多線程一般情況下,需要用戶交互的軟件都必須盡可能快地對用戶的活動做出反應(yīng),以便提供豐富多彩的用戶體驗(yàn),但同時它又必須執(zhí)行必要的計(jì)算以便盡可能快地將數(shù)據(jù)呈現(xiàn)給用戶,這時可以使用多線程來實(shí)現(xiàn)。通過網(wǎng)絡(luò)與Web服務(wù)器和數(shù)據(jù)庫進(jìn)行通信。執(zhí)行占用大量時間的操作。區(qū)分具有不同優(yōu)先級的任務(wù)。使用戶界面可以在將時間分配給后臺任務(wù)時仍能快速做出響應(yīng)。2

線程的基本操作主要內(nèi)容

線程的創(chuàng)建與啟動

線程的掛起與恢復(fù)

線程休眠

終止線程01020304

線程的優(yōu)先級05

C#中對線程進(jìn)行操作時,主要用到了Thread類,該類位于System.Threading命名空間下。創(chuàng)建一個線程非常簡單,只需將其聲明并為其提供線程起始點(diǎn)處的方法委托即可。創(chuàng)建新的線程時,需要使用Thread類,Thread類具有接受一個ThreadStart委托或ParameterizedThreadStart委托的構(gòu)造函數(shù),該委托包裝了調(diào)用Start方法時由新線程調(diào)用的方法。創(chuàng)建了Thread類的對象之后,線程對象已存在并已配置,但并未創(chuàng)建實(shí)際的線程,這時,只有在調(diào)用Start方法后,才會創(chuàng)建實(shí)際的線程。線程的創(chuàng)建與啟動publicvoidStart()publicvoidStart(Objectparameter)語法publicvoidSuspend()線程的掛起與恢復(fù)publicvoidResume()

線程的掛起線程的恢復(fù)publicstaticvoidSleep(intmillisecondsTimeout)線程休眠publicstaticvoidSleep(TimeSpantimeout)

將當(dāng)前線程掛起指定的時間將當(dāng)前線程阻止指定的時間量publicvoidAbort()publicvoidAbort(ObjectstateInfo)終止線程publicvoidJoin()publicboolJoin(intmillisecondsTimeout)publicboolJoin(TimeSpantimeout)

Abort方法Join方法線程的優(yōu)先級優(yōu)先級值說

明AboveNormal可以將Thread安排在具有Highest優(yōu)先級的線程之后,在具有Normal優(yōu)先級的線程之前BelowNormal可以將Thread安排在具有Normal優(yōu)先級的線程之后,在具有Lowest優(yōu)先級的線程之前Highest可以將Thread安排在具有任何其他優(yōu)先級的線程之前Lowest可以將Thread安排在具有任何其他優(yōu)先級的線程之后Normal可以將Thread安排在具有AboveNormal優(yōu)先級的線程之后,在具有BelowNormal優(yōu)先級的線程之前。默認(rèn)情況下,線程具有Normal優(yōu)先級使用線程實(shí)現(xiàn)大容量數(shù)據(jù)的計(jì)算,這里要求計(jì)算7的50次冪、2的2次冪和2的4次冪。3

線程同步主要內(nèi)容

lock關(guān)鍵字

線程監(jiān)視器——Monitor0102lock關(guān)鍵字語法lock關(guān)鍵字可以用來確保代碼塊完成運(yùn)行,而不會被其他線程中斷,它是通過在代碼塊運(yùn)行期間為給定對象獲取互斥鎖來實(shí)現(xiàn)的。lock語句以關(guān)鍵字lock開頭,它有一個作為參數(shù)的對象,在該參數(shù)的后面還有一個一次只能有一個線程執(zhí)行的代碼塊。ObjectthisLock=newObject();lock(thisLock){//要運(yùn)行的代碼塊}線程監(jiān)視器——Monitor語法Monitor類提供了同步對對象的訪問機(jī)制,它通過向單個線程授予對象鎖來控制對對象的訪問,對象鎖提供限制訪問代碼塊(通常稱為臨界區(qū))的能力。當(dāng)一個線程擁有對象鎖時,其他任何線程都不能獲取該鎖。Monitor.Enter(obj); Console.WriteLine("i的初始值為:"+i.ToString());Thread.Sleep(1000);i++;Console.WriteLine("i在自增之后的值為:"+i.ToString());Monitor.Exit(obj);方

法說

明Enter在指定對象上獲取排他鎖Exit釋放指定對象上的排他鎖Wait釋放對象上的鎖并阻止當(dāng)前線程,直到它重新獲取該鎖4

線程池和定時器線程池語法

線程池通過為應(yīng)用程序提供一個由系統(tǒng)管理的輔助線程池,使您可以更為有效地使用線程。.NET中的ThreadPool類用來提供一個線程池,該線程池可用于執(zhí)行任務(wù)、發(fā)送工作項(xiàng)、處理異步I/O、代表其他線程等待以及處理計(jì)時器。

如果要請求由線程池中的一個線程來處理工作項(xiàng),需要使用QueueUserWorkItem方法,該方法將對被從線程池中選定的線程調(diào)用的方法或委托的引用用作參數(shù)。publicstaticboolQueueUserWorkItem(WaitCallbackcallBack)

publicstaticboolQueueUserWorkItem(WaitCallbackcallBack,Objectstate)

每個進(jìn)程都有一個線程池。從.NETFramework4開始,進(jìn)程的線程池的默認(rèn)大小由虛擬地址空間的大小等多個因素決定。進(jìn)程可以調(diào)用GetMaxThreads方法以確定線程的數(shù)量。使用

SetMaxThreads方法可以更改線程池中的線程數(shù)。每個線程使用默認(rèn)的堆棧大小并按照默認(rèn)的優(yōu)先級運(yùn)行。定時器語法.NET中的Timer類表示定時器,用來提供以指定的時間間隔執(zhí)行方法的機(jī)制。使用TimerCallback委托指定希望Timer執(zhí)行的方法。定時器委托在構(gòu)造計(jì)時器時指定,并且不能更改,此方法不在創(chuàng)建計(jì)時器的線程上執(zhí)行,而是在系統(tǒng)提供的ThreadPool線程上執(zhí)行。publicTimer(TimerCallbackcallback)publicTimer(TimerCallbackcallback,Objectstate,intdueTime,intperiod)publicTimer(TimerCallbackcallback,Objectstate,longdueTime,longperiod)publicTimer(TimerCallbackcallback,Objectstate,TimeSpandueTime,TimeSpanperiod)publicTimer(TimerCallbackcallback,Objectstate,uintdueTime,uintperiod)Timer類最常用的方法有兩個,一個是Change方法,用來更改計(jì)時器的啟動時間和方法調(diào)用之間的間隔;另外一個是Dispose方法,用來釋放由Timer對象使用的所有資源。5

互斥對象——Mutex互斥對象——Mutex語法Mutex類是同步基元,它只向一個線程授予對共享資源的獨(dú)占訪問權(quán)。如果一個線程獲取了互斥體,則要獲取該互斥體的第二個線程將被掛起,直到第一個線程釋放該互斥體。Mutex類與監(jiān)視器類似,它防止多個線程在某一時間同時執(zhí)行某個代碼塊,然而與監(jiān)視器不同的是,Mutex類可以用來使跨進(jìn)程的線程同步。

可以使用Mutex類的WaitOne方法請求互斥體的所屬權(quán),擁有互斥體的線程可以在對WaitOne方法的重復(fù)調(diào)用中請求相同的互斥體而不會阻止其執(zhí)行,但線程必須調(diào)用同樣多次數(shù)的Mutex類的ReleaseMutex方法來釋放互斥體的所屬權(quán)。Mutex類強(qiáng)制線程標(biāo)識,因此互斥體只能由獲得它的線程釋放。Mutex類的常用方法方

法說

明Close在派生類中被重寫時,釋放由當(dāng)前WaitHandle持有的所有資源ReleaseMutex釋放Mutex一次WaitOne當(dāng)在派生類中重寫時,阻止當(dāng)前線程,直到當(dāng)前的WaitHandle收到信號小結(jié)本章首先對線程的分類及概述做了一個簡單地介紹,然后詳細(xì)講解了C#中進(jìn)行線程編程的主要類Thread,并對線程編程的常用操作、線程同步與互斥,以及線程池和定時器的使用進(jìn)行了詳細(xì)講解。通過本章的學(xué)習(xí),讀者應(yīng)該熟練掌握使用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論