




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、CWinForm實踐開發(fā)教程多線程編程技術(shù)-基于C#語言主講教師:錢 哨本課學時:72課時聯(lián)系方式:Windows程序設(shè)計CWinForm實踐開發(fā)教程多線程編程技術(shù)第五章、多線程編程技術(shù)n本章主要內(nèi)容介紹5.1 計算機線程介紹5.2 System.Threading簡介5.3 線程的優(yōu)先級與鎖技術(shù)CONTENTCWinForm實踐開發(fā)教程多線程編程技術(shù)本章學習目標:本章學習目標: 理解線程的概念 理解.NET中線程的屬性和方法 創(chuàng)建和使用線程 理解線程的特點、優(yōu)點及使用場合CWinForm實踐開發(fā)教程多線程編程技術(shù)同時執(zhí)行所有任務,時間更少,效率更高 人 體5.1 線程簡介讀 ,寫一覽無遺血液
2、循環(huán)在同一時間點執(zhí)行各項進程 編譯程序 發(fā)送/接收郵件 打印文件 其他操作系統(tǒng)允許計算機同時執(zhí)行多項操作程序(進程)CWinForm實踐開發(fā)教程多線程編程技術(shù)5.1 線程簡介程序 1 程序 2線程 1線程 2線程 3線程 1線程 2線程 3單獨的執(zhí)行路徑CWinForm實踐開發(fā)教程多線程編程技術(shù)5.1 線程簡介 進程:進程:是應用程序的一個運行例程,是應用程序的一次動態(tài)執(zhí)行過程。 線程:線程:是進程中的一個執(zhí)行單元;是操作系統(tǒng)分配CPU時間的基本單元。n Windows是一個支持多線程的系統(tǒng)。n 一個進程可以包含若干個線程。CWinForm實踐開發(fā)教程多線程編程技術(shù)5.1 線程簡介在以下情況中
3、可能要使用到多線程: l程序需要同時執(zhí)行兩個或多個任務l程序要等待某事件的發(fā)生,例如用戶輸入、文件操作、網(wǎng)絡(luò)操作、搜索等l后臺程序CWinForm實踐開發(fā)教程多線程編程技術(shù)5.1 線程簡介 多線程:多線程:在同一時間執(zhí)行多個任務的功能,稱為多線程或自由線程。 多線程的優(yōu)點:多線程的優(yōu)點:可以同時完成多個任務;可以使程序的響應速度更快;可以讓占用大量處理時間的任務或當前沒有進行處理的任務定期將處理時間讓給別的任務;可以隨時停止任務;可以設(shè)置每個任務的優(yōu)先級以優(yōu)化程序性能。 多線程的缺點:多線程的缺點: 對資源的共享訪問可能造成沖突(對共享資源的訪問進行同步或控制) ;程序的整體運行速度減慢等等。
4、在C#應用程序中,第一個線程總是Main()方法,因為第一個線程是由.NET運行庫開始執(zhí)行的,Main()方法是.NET運行庫選擇的第一個方法。后續(xù)的線程由應用程序在內(nèi)部啟動,即應用程序可以創(chuàng)建和啟動新的線程。CWinForm實踐開發(fā)教程多線程編程技術(shù)5.2 System.Threading 命名空間CWinForm實踐開發(fā)教程多線程編程技術(shù)5.2 System.Threading 命名空間 在.NET程序設(shè)計中,線程是使用Thread類(或Timer類(線程計數(shù)器)、ThreadPool類(線程池)來處理的,這些類在System.Threading命名空間中: using System.Th
5、reading; Thread類:類:(實現(xiàn)線程的主要方法)一個Thread實例管理一個線程,即執(zhí)行序列。通過簡單實例化一個Thread對象,就可以創(chuàng)建一個線程,然后通過Thread對象提供的方法對線程進行管理。 Timer類:類:適用于間隔性的完成任務。 ThreadPool類:類:適用于多個小的線程。CWinForm實踐開發(fā)教程多線程編程技術(shù)1、Thread 類的屬性和方法引用System.Threading 命名空間Thread 線程實例名 = new Thread(new ThreadStart(方法名);運行在線程上的方法只創(chuàng)建但不啟動線程只創(chuàng)建但不啟動線程線程實例名.Start()
6、;CWinForm實踐開發(fā)教程多線程編程技術(shù)1、Thread 類的屬性和方法屬性屬性CurrentThread獲取當前正在運行的線程IsAlive指示當前線程的執(zhí)行狀態(tài)Name獲取或設(shè)置線程的名稱Priority獲取或設(shè)置線程的優(yōu)先級CurrentContext獲取線程其中執(zhí)行的當前上下文IsBackground指示線程是否為后臺線程ThreadState獲取或設(shè)置線程的當前狀態(tài)方法方法Sleep()將當前線程阻塞指定的毫秒數(shù)Abort()終止線程Join()阻塞調(diào)用線程,直到某個線程終止時為止Resume()繼續(xù)已掛起的線程Start() 啟動線程Suspend()掛起線程GetDomain
7、返回當前線程正在其中運行的當前域Interrupt中斷處于WaitSleepJoin線程狀態(tài)的線程ResetAbort取消為當前線程請求的AbortCWinForm實踐開發(fā)教程多線程編程技術(shù)2、線程的生命周期在 I/O 操作期間線程被阻止線程已創(chuàng)建但并未啟動線程已啟動I/O 操作完成后運行線程被阻止,另一個操作正在進行提前中斷或特地停止線程暫時中斷的線程 線程已恢復等待等待 / / 休眠休眠 / / 加入加入已暫停已暫停正在運行正在運行已停止已停止未開始未開始已開始已開始已阻止已阻止暫停暫停發(fā)送發(fā)送 I/O 請求請求等待等待, 休眠休眠, 加入加入開始開始I/O 完成完成完成完成恢復恢復CWi
8、nForm實踐開發(fā)教程多線程編程技術(shù)5.3 線程的建立與啟動新建一個線程的過程:只需將其聲明并為其提供線程起始點處的方法委托,再用Thread.Start()方法啟動該線程(1)聲明:Thread a;(2)實例化a=new Thread(new ThreadStart(b);其中,b為新建過程中執(zhí)行的過程名。(3)調(diào)用Thread.Start()方法啟動該線程a.Start();CWinForm實踐開發(fā)教程多線程編程技術(shù)5.3 線程的建立與啟動using System;using System.Threading;public class A public void ff()/線程啟動時調(diào)用
9、此方法Console.WriteLine(A.ff()方法在另一個線程上運行!);Thread.Sleep(3000);/將線程阻塞一定時間Console.WriteLine(終止工作線程調(diào)用此實例方法!);public static void gg()Console.WriteLine(A.gg()方法在另一個線程上運行!);Thread.Sleep(5000);/將線程阻塞一定時間Console.WriteLine(終止工作線程調(diào)用此靜態(tài)方法!);例題1:線程的建立和啟動CWinForm實踐開發(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實踐開發(fā)教程多線程編
11、程技術(shù)5.3 線程的建立與啟動線程的掛起(或暫停)線程的掛起(或暫停)(1)調(diào)用Thread.Sleep()方法將線程掛起。注:Sleep()方法指定的時間以毫秒為單位。(2)調(diào)用s1.Suspend() 方法將線程掛起區(qū)別:前者為靜態(tài)方法,并且使線程立即暫停一定時間;后者為實例方法,不會使線程立即停止執(zhí)行,直到線程到達安全點之后,它才將該線程暫停。線程的恢復與終止線程的恢復與終止調(diào)用Resume()方法將線程恢復;調(diào)用Abort()方法將線程終止;線程的掛起、恢復與終止其他與操作線程相關(guān)的方法Join():使一個線程等待另一個線程停止Interrupt():中斷處于JoinWaitSleep
12、線程狀態(tài)的線程。CWinForm實踐開發(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)先級線程,同時執(zhí)行,輸出無序.CWinForm實踐開發(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í)行第一個線程前執(zhí)行 objThreadTwo5.4 線程的優(yōu)先級CWinForm實踐開發(fā)教程多線程編程技術(shù)5.4 線程的優(yōu)先級【代碼見下:】問題:請將代碼執(zhí)行多次,觀察每次執(zhí)行順序的不同之處。為什么代碼執(zhí)行是完全不同呢?【結(jié)論:】如果不將線程按照一定的順序運行,則線程代碼在處理上將會混亂不堪。例題2:使用三個線程顯示計數(shù)CWinForm實踐開發(fā)教程多線程編程技術(shù)5.4 線程的優(yōu)先級【線程優(yōu)先級小結(jié):】 如果自行提高一個線程的優(yōu)先級,那么該線程就會相應相應的獲得更多的的獲得更多的CPU時間時間;通過降低了線程的優(yōu)先級,該線程
16、就會被分配到比原來少的被分配到比原來少的CPU時間了時間了。 你可以在一個線程開始運行前或是在它的運行過程中的任何時候改變它的優(yōu)先級。理論上你還可以任意的設(shè)置每個線程的優(yōu)先級,不過一個優(yōu)先級過高的線程往往會影響不過一個優(yōu)先級過高的線程往往會影響到其他線程的運行,甚至影響到其他程序的運行,所以最到其他線程的運行,甚至影響到其他程序的運行,所以最好不要隨意的設(shè)置線程的優(yōu)先級。好不要隨意的設(shè)置線程的優(yōu)先級。 例題1:使用三個線程顯示計數(shù)【代碼更改】CWinForm實踐開發(fā)教程多線程編程技術(shù)5.5 線程的同步使用線程的一個重要方面是同步訪問多個線程訪問的任何變量同步訪問多個線程訪問的任何變量。n 背景
17、:背景:當多個線程共享數(shù)據(jù),其中一個或多個線程要修改數(shù)據(jù)時,有可能引起數(shù)據(jù)不統(tǒng)一等問題。n 同步:同步:是指在某一時刻只有一個線程可以訪問某共享數(shù)據(jù)。1、同步的含義、同步的含義 同步問題的產(chǎn)生,主要是由于在高級語言的源代碼中,大多數(shù)情況下看起來是一條語句,但在最后編譯好的匯編語言機器碼中則會被翻譯為許多條語句,從而在操作系統(tǒng)調(diào)度時被劃分到不同的時間片中。例如CWinForm實踐開發(fā)教程多線程編程技術(shù)5.5 線程的同步例如:message += Hello world!;這條語句在C#語法上是一條語句,但在執(zhí)行代碼時,實際上它涉及到許多操作。需要重新分配內(nèi)存以存儲更長的新字符串,需要設(shè)置變量me
18、ssage使之指向新的內(nèi)存,需要復制實際文本等。CWinForm實踐開發(fā)教程多線程編程技術(shù)5.5 線程的同步 通過對指定對象的加鎖和解鎖可以實現(xiàn)同步代碼段的訪問。在.NET的System.Threading命名空間中提供了Monitor類類來實現(xiàn)加鎖與解鎖加鎖與解鎖。該類中的方法都是靜態(tài)的。如下表:1、在、在C#中處理同步中處理同步CWinForm實踐開發(fā)教程多線程編程技術(shù)鎖定機制程序線程1 1線程2 2共享資源 鎖定機制保證每次只有一個線程可以訪問共享資源緩沖和隔離CWinForm實踐開發(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(“線程名: + );實例化 newThread 線程并開始執(zhí)行 DoTask() 鎖定當前實例 objDemo,在塊中完成執(zhí)行,
20、然后釋放對象CWinForm實踐開發(fā)教程多線程編程技術(shù)5.5 線程的同步 C#中 lock關(guān)鍵字關(guān)鍵字提供了與Monitoy.Enter和和Monitoy.Exit同樣的功能,這種方法用在你的代碼段不能被其他獨立的線程中斷的情況。通過對Monitor類的簡易封裝,lock為同步訪問變量提供了一個非常簡單的方式,其用法如下:lock(x) / 使用x的語句1、在、在C#中處理同步中處理同步 lock語句把變量放在圓括號中,以包裝對象,稱為獨占鎖獨占鎖或排它鎖排它鎖。當執(zhí)行帶有l(wèi)ock關(guān)鍵字的復合語句時,獨占鎖會保留下來。當變量被包裝在獨占鎖中時,其他線程就不能訪問該變量。如果在上面的代碼中使用獨占鎖,在執(zhí)行復合語句時,這個線程就會失去其時間片。如果下一個獲得時間片的線程試圖訪問變量,就會被拒絕。Windows會讓其他線程處于睡眠
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 大學辦公室裝修協(xié)議書
- 租用辦學協(xié)議書
- 職工勞動協(xié)議書
- 負債歸屬協(xié)議書
- 手機店入股合同協(xié)議書
- 自考保過協(xié)議書
- 夫妻按揭房約定協(xié)議書
- 股票賬戶協(xié)議書
- 簽訂工資協(xié)議書
- 賠償修車協(xié)議書
- 2025屆福建省漳州市高三第三次教學質(zhì)量檢測生物試卷(解析版)
- 2025年茶葉加工工職業(yè)技能競賽參考試題庫500題(含答案)
- 2025甘肅陜煤集團韓城煤礦招聘250人筆試參考題庫附帶答案詳解
- 2025年社區(qū)工作的理論與實務考試題及答案
- 《設(shè)計課件:構(gòu)建高效數(shù)據(jù)集教程》
- 2025江蘇中考:歷史高頻考點
- 普通測量學試題及答案
- 國家開放大學2025年《創(chuàng)業(yè)基礎(chǔ)》形考任務3答案
- 醫(yī)療器械網(wǎng)絡(luò)銷售質(zhì)量管理規(guī)范宣貫培訓課件2025年
- 語文課程資源的開發(fā)與利用
- 2024年09月四川天府新區(qū)人民醫(yī)院招聘6人筆試歷年專業(yè)考點(難、易錯點)附帶答案詳解
評論
0/150
提交評論