




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)-基于C#語言主講教師:錢 哨本課學(xué)時(shí):72課時(shí)聯(lián)系方式:Windows程序設(shè)計(jì)CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)第五章、多線程編程技術(shù)n本章主要內(nèi)容介紹5.1 計(jì)算機(jī)線程介紹5.2 System.Threading簡介5.3 線程的優(yōu)先級與鎖技術(shù)CONTENTCWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)本章學(xué)習(xí)目標(biāo):本章學(xué)習(xí)目標(biāo): 理解線程的概念 理解.NET中線程的屬性和方法 創(chuàng)建和使用線程 理解線程的特點(diǎn)、優(yōu)點(diǎn)及使用場合CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)同時(shí)執(zhí)行所有任務(wù),時(shí)間更少,效率更高 人 體5.1 線程簡介讀 ,寫一覽無遺血液
2、循環(huán)在同一時(shí)間點(diǎn)執(zhí)行各項(xiàng)進(jìn)程 編譯程序 發(fā)送/接收郵件 打印文件 其他操作系統(tǒng)允許計(jì)算機(jī)同時(shí)執(zhí)行多項(xiàng)操作程序(進(jìn)程)CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.1 線程簡介程序 1 程序 2線程 1線程 2線程 3線程 1線程 2線程 3單獨(dú)的執(zhí)行路徑CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.1 線程簡介 進(jìn)程:進(jìn)程:是應(yīng)用程序的一個(gè)運(yùn)行例程,是應(yīng)用程序的一次動態(tài)執(zhí)行過程。 線程:線程:是進(jìn)程中的一個(gè)執(zhí)行單元;是操作系統(tǒng)分配CPU時(shí)間的基本單元。n Windows是一個(gè)支持多線程的系統(tǒng)。n 一個(gè)進(jìn)程可以包含若干個(gè)線程。CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.1 線程簡介在以下情況中
3、可能要使用到多線程: l程序需要同時(shí)執(zhí)行兩個(gè)或多個(gè)任務(wù)l程序要等待某事件的發(fā)生,例如用戶輸入、文件操作、網(wǎng)絡(luò)操作、搜索等l后臺程序CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.1 線程簡介 多線程:多線程:在同一時(shí)間執(zhí)行多個(gè)任務(wù)的功能,稱為多線程或自由線程。 多線程的優(yōu)點(diǎn):多線程的優(yōu)點(diǎn):可以同時(shí)完成多個(gè)任務(wù);可以使程序的響應(yīng)速度更快;可以讓占用大量處理時(shí)間的任務(wù)或當(dāng)前沒有進(jìn)行處理的任務(wù)定期將處理時(shí)間讓給別的任務(wù);可以隨時(shí)停止任務(wù);可以設(shè)置每個(gè)任務(wù)的優(yōu)先級以優(yōu)化程序性能。 多線程的缺點(diǎn):多線程的缺點(diǎn): 對資源的共享訪問可能造成沖突(對共享資源的訪問進(jìn)行同步或控制) ;程序的整體運(yùn)行速度減慢等等。
4、在C#應(yīng)用程序中,第一個(gè)線程總是Main()方法,因?yàn)榈谝粋€(gè)線程是由.NET運(yùn)行庫開始執(zhí)行的,Main()方法是.NET運(yùn)行庫選擇的第一個(gè)方法。后續(xù)的線程由應(yīng)用程序在內(nèi)部啟動,即應(yīng)用程序可以創(chuàng)建和啟動新的線程。CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.2 System.Threading 命名空間CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.2 System.Threading 命名空間 在.NET程序設(shè)計(jì)中,線程是使用Thread類(或Timer類(線程計(jì)數(shù)器)、ThreadPool類(線程池)來處理的,這些類在System.Threading命名空間中: using System.Th
5、reading; Thread類:類:(實(shí)現(xiàn)線程的主要方法)一個(gè)Thread實(shí)例管理一個(gè)線程,即執(zhí)行序列。通過簡單實(shí)例化一個(gè)Thread對象,就可以創(chuàng)建一個(gè)線程,然后通過Thread對象提供的方法對線程進(jìn)行管理。 Timer類:類:適用于間隔性的完成任務(wù)。 ThreadPool類:類:適用于多個(gè)小的線程。CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)1、Thread 類的屬性和方法引用System.Threading 命名空間Thread 線程實(shí)例名 = new Thread(new ThreadStart(方法名);運(yùn)行在線程上的方法只創(chuàng)建但不啟動線程只創(chuàng)建但不啟動線程線程實(shí)例名.Start()
6、;CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)1、Thread 類的屬性和方法屬性屬性CurrentThread獲取當(dāng)前正在運(yùn)行的線程IsAlive指示當(dāng)前線程的執(zhí)行狀態(tài)Name獲取或設(shè)置線程的名稱Priority獲取或設(shè)置線程的優(yōu)先級CurrentContext獲取線程其中執(zhí)行的當(dāng)前上下文IsBackground指示線程是否為后臺線程ThreadState獲取或設(shè)置線程的當(dāng)前狀態(tài)方法方法Sleep()將當(dāng)前線程阻塞指定的毫秒數(shù)Abort()終止線程Join()阻塞調(diào)用線程,直到某個(gè)線程終止時(shí)為止Resume()繼續(xù)已掛起的線程Start() 啟動線程Suspend()掛起線程GetDomain
7、返回當(dāng)前線程正在其中運(yùn)行的當(dāng)前域Interrupt中斷處于WaitSleepJoin線程狀態(tài)的線程ResetAbort取消為當(dāng)前線程請求的AbortCWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)2、線程的生命周期在 I/O 操作期間線程被阻止線程已創(chuàng)建但并未啟動線程已啟動I/O 操作完成后運(yùn)行線程被阻止,另一個(gè)操作正在進(jìn)行提前中斷或特地停止線程暫時(shí)中斷的線程 線程已恢復(fù)等待等待 / / 休眠休眠 / / 加入加入已暫停已暫停正在運(yùn)行正在運(yùn)行已停止已停止未開始未開始已開始已開始已阻止已阻止暫停暫停發(fā)送發(fā)送 I/O 請求請求等待等待, 休眠休眠, 加入加入開始開始I/O 完成完成完成完成恢復(fù)恢復(fù)CWi
8、nForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.3 線程的建立與啟動新建一個(gè)線程的過程:只需將其聲明并為其提供線程起始點(diǎn)處的方法委托,再用Thread.Start()方法啟動該線程(1)聲明:Thread a;(2)實(shí)例化a=new Thread(new ThreadStart(b);其中,b為新建過程中執(zhí)行的過程名。(3)調(diào)用Thread.Start()方法啟動該線程a.Start();CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.3 線程的建立與啟動using System;using System.Threading;public class A public void ff()/線程啟動時(shí)調(diào)用
9、此方法Console.WriteLine(A.ff()方法在另一個(gè)線程上運(yùn)行!);Thread.Sleep(3000);/將線程阻塞一定時(shí)間Console.WriteLine(終止工作線程調(diào)用此實(shí)例方法!);public static void gg()Console.WriteLine(A.gg()方法在另一個(gè)線程上運(yùn)行!);Thread.Sleep(5000);/將線程阻塞一定時(shí)間Console.WriteLine(終止工作線程調(diào)用此靜態(tài)方法!);例題1:線程的建立和啟動CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.3 線程的建立與啟動public class Bpublic static
10、 void Main()Console.WriteLine(*線程簡單示例!*);A a=new A();Thread s1=new Thread(new ThreadStart(a.ff);s1.Start();Console.WriteLine(啟動新線程ff()方法后,被Main()線程調(diào)用!);Thread s2=new Thread(new ThreadStart(A.gg);s2.Start();Console.WriteLine(啟動新線程gg()方法后,被Main()線程調(diào)用!);Console.ReadLine();例題1:線程的建立和啟動CWinForm實(shí)踐開發(fā)教程多線程編
11、程技術(shù)5.3 線程的建立與啟動線程的掛起(或暫停)線程的掛起(或暫停)(1)調(diào)用Thread.Sleep()方法將線程掛起。注:Sleep()方法指定的時(shí)間以毫秒為單位。(2)調(diào)用s1.Suspend() 方法將線程掛起區(qū)別:前者為靜態(tài)方法,并且使線程立即暫停一定時(shí)間;后者為實(shí)例方法,不會使線程立即停止執(zhí)行,直到線程到達(dá)安全點(diǎn)之后,它才將該線程暫停。線程的恢復(fù)與終止線程的恢復(fù)與終止調(diào)用Resume()方法將線程恢復(fù);調(diào)用Abort()方法將線程終止;線程的掛起、恢復(fù)與終止其他與操作線程相關(guān)的方法Join():使一個(gè)線程等待另一個(gè)線程停止Interrupt():中斷處于JoinWaitSleep
12、線程狀態(tài)的線程。CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.4 線程的優(yōu)先級class SimpleThreadDemo static void Main(string args) = “主線程;Thread objThread = new Thread(new ThreadStart(ActionMethod); = “子線程; /啟動子線程, 并為該線程執(zhí)行 ActionMethodobjThread.Start();/這將為主線程執(zhí)行 ActionMethodActionMethod(); static void ActionMethod() for(int count = 1; co
13、unt =4990; index-) Console.WriteLine(index); static void Main(string args)Thread objThreadOne = new Thread(new ThreadStart(TaskOne);Thread objThreadTwo = new Thread(new ThreadStart(TaskTwo);objThreadOne.Start();objThreadTwo.Start();static void TaskOne() for(int count=1;count=5;count+) Console.WriteL
14、ine(count*2); 無優(yōu)先級線程,同時(shí)執(zhí)行,輸出無序.CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)例題1:static void Main(string args) = “主線程; Thread objThreadOne = new Thread(new ThreadStart(TaskOne); = “子線程 1; Thread objThreadTwo = new Thread(new ThreadStart(TaskTwo); = “子線程 2; / 這將啟動子線程 objThreadOne.Start(); objThreadTwo.Start(); objThreadTwo.P
15、riority = ThreadPriority.Highest;將在執(zhí)行第一個(gè)線程前執(zhí)行 objThreadTwo5.4 線程的優(yōu)先級CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.4 線程的優(yōu)先級【代碼見下:】問題:請將代碼執(zhí)行多次,觀察每次執(zhí)行順序的不同之處。為什么代碼執(zhí)行是完全不同呢?【結(jié)論:】如果不將線程按照一定的順序運(yùn)行,則線程代碼在處理上將會混亂不堪。例題2:使用三個(gè)線程顯示計(jì)數(shù)CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.4 線程的優(yōu)先級【線程優(yōu)先級小結(jié):】 如果自行提高一個(gè)線程的優(yōu)先級,那么該線程就會相應(yīng)相應(yīng)的獲得更多的的獲得更多的CPU時(shí)間時(shí)間;通過降低了線程的優(yōu)先級,該線程
16、就會被分配到比原來少的被分配到比原來少的CPU時(shí)間了時(shí)間了。 你可以在一個(gè)線程開始運(yùn)行前或是在它的運(yùn)行過程中的任何時(shí)候改變它的優(yōu)先級。理論上你還可以任意的設(shè)置每個(gè)線程的優(yōu)先級,不過一個(gè)優(yōu)先級過高的線程往往會影響不過一個(gè)優(yōu)先級過高的線程往往會影響到其他線程的運(yùn)行,甚至影響到其他程序的運(yùn)行,所以最到其他線程的運(yùn)行,甚至影響到其他程序的運(yùn)行,所以最好不要隨意的設(shè)置線程的優(yōu)先級。好不要隨意的設(shè)置線程的優(yōu)先級。 例題1:使用三個(gè)線程顯示計(jì)數(shù)【代碼更改】CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.5 線程的同步使用線程的一個(gè)重要方面是同步訪問多個(gè)線程訪問的任何變量同步訪問多個(gè)線程訪問的任何變量。n 背景
17、:背景:當(dāng)多個(gè)線程共享數(shù)據(jù),其中一個(gè)或多個(gè)線程要修改數(shù)據(jù)時(shí),有可能引起數(shù)據(jù)不統(tǒng)一等問題。n 同步:同步:是指在某一時(shí)刻只有一個(gè)線程可以訪問某共享數(shù)據(jù)。1、同步的含義、同步的含義 同步問題的產(chǎn)生,主要是由于在高級語言的源代碼中,大多數(shù)情況下看起來是一條語句,但在最后編譯好的匯編語言機(jī)器碼中則會被翻譯為許多條語句,從而在操作系統(tǒng)調(diào)度時(shí)被劃分到不同的時(shí)間片中。例如CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.5 線程的同步例如:message += Hello world!;這條語句在C#語法上是一條語句,但在執(zhí)行代碼時(shí),實(shí)際上它涉及到許多操作。需要重新分配內(nèi)存以存儲更長的新字符串,需要設(shè)置變量me
18、ssage使之指向新的內(nèi)存,需要復(fù)制實(shí)際文本等。CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.5 線程的同步 通過對指定對象的加鎖和解鎖可以實(shí)現(xiàn)同步代碼段的訪問。在.NET的System.Threading命名空間中提供了Monitor類類來實(shí)現(xiàn)加鎖與解鎖加鎖與解鎖。該類中的方法都是靜態(tài)的。如下表:1、在、在C#中處理同步中處理同步CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)鎖定機(jī)制程序線程1 1線程2 2共享資源 鎖定機(jī)制保證每次只有一個(gè)線程可以訪問共享資源緩沖和隔離CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)示例class ThreadLockDemostatic void Main() =
19、“主線程;ThreadLockDemo objDemo = new ThreadLockDemo();Thread newThread = new Thread(new ThreadStart(objDemo.DoTask); = “子線程;newThread.Start();objDemo.DoTask();void DoTask()lock(this)for(int count = 1; count = 10 ; count+)Console.WriteLine(“線程名: + );實(shí)例化 newThread 線程并開始執(zhí)行 DoTask() 鎖定當(dāng)前實(shí)例 objDemo,在塊中完成執(zhí)行,
20、然后釋放對象CWinForm實(shí)踐開發(fā)教程多線程編程技術(shù)5.5 線程的同步 C#中 lock關(guān)鍵字關(guān)鍵字提供了與Monitoy.Enter和和Monitoy.Exit同樣的功能,這種方法用在你的代碼段不能被其他獨(dú)立的線程中斷的情況。通過對Monitor類的簡易封裝,lock為同步訪問變量提供了一個(gè)非常簡單的方式,其用法如下:lock(x) / 使用x的語句1、在、在C#中處理同步中處理同步 lock語句把變量放在圓括號中,以包裝對象,稱為獨(dú)占鎖獨(dú)占鎖或排它鎖排它鎖。當(dāng)執(zhí)行帶有l(wèi)ock關(guān)鍵字的復(fù)合語句時(shí),獨(dú)占鎖會保留下來。當(dāng)變量被包裝在獨(dú)占鎖中時(shí),其他線程就不能訪問該變量。如果在上面的代碼中使用獨(dú)占鎖,在執(zhí)行復(fù)合語句時(shí),這個(gè)線程就會失去其時(shí)間片。如果下一個(gè)獲得時(shí)間片的線程試圖訪問變量,就會被拒絕。Windows會讓其他線程處于睡眠
溫馨提示
- 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)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年軟考網(wǎng)絡(luò)管理員研究試題及答案
- 山東省濟(jì)南市萊蕪區(qū)2025屆數(shù)學(xué)七下期末達(dá)標(biāo)檢測試題含解析
- 會計(jì)個(gè)人工作計(jì)劃成功案例分享
- 秋季學(xué)期學(xué)生社交能力培養(yǎng)計(jì)劃
- 開展班級閱讀活動的方案計(jì)劃
- 網(wǎng)絡(luò)架構(gòu)審計(jì)的必要性及試題及答案
- 供應(yīng)鏈管理優(yōu)化計(jì)劃
- 前臺文員專業(yè)知識更新計(jì)劃
- 理解網(wǎng)絡(luò)協(xié)議與試題及答案指導(dǎo)
- 2024年上海建橋?qū)W院輔導(dǎo)員考試真題
- 快速康復(fù)理念與圍手術(shù)期護(hù)理
- 2025年煙臺經(jīng)濟(jì)技術(shù)開發(fā)區(qū)社區(qū)工作者招考高頻重點(diǎn)提升(共500題)附帶答案詳解
- 市政道路工程冬季施工方案及措施
- 2023年山東省濟(jì)寧市中考?xì)v史真題(原卷版)
- 電機(jī)控制與調(diào)速技術(shù)課件 項(xiàng)目四 步進(jìn)電動機(jī)控制與調(diào)速技術(shù)
- 2024版保險(xiǎn)合同法律適用與條款解釋3篇
- 【MOOC】人格與精神障礙-學(xué)做自己的心理醫(yī)生-暨南大學(xué) 中國大學(xué)慕課MOOC答案
- 外科經(jīng)典換藥術(shù)
- 2024年支氣管哮喘臨床診療指南:課件精講
- 《滑翔傘模擬器控制系統(tǒng)的設(shè)計(jì)與研究》
- 公務(wù)員考試題庫及答案4000題
評論
0/150
提交評論