版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
工業(yè)和信息化部“十二五”規(guī)劃教材
普通高等學(xué)?!笆濉币?guī)劃教材
《C#網(wǎng)絡(luò)應(yīng)用編程》第3版
第3章進(jìn)程、線程與
應(yīng)用程序域2Ch1進(jìn)程、線程與應(yīng)用程序域3.1進(jìn)程和線程3.2應(yīng)用程序域及其基本操作3.1進(jìn)程和線程3.1.1基本概念3.1.2進(jìn)程管理(Process類)3.1.3線程管理(Thread類)3.1.4線程池(ThreadPool類)3.1.5多線程編程中的資源同步3.1.6WPF中的多線程編程模型43.1.1基本概念進(jìn)程進(jìn)程是操作系統(tǒng)級(jí)別的一個(gè)基本概念,可以將其簡單地理解為“正在運(yùn)行的程序”。進(jìn)程之間是相互獨(dú)立的。在操作系統(tǒng)級(jí)別的管理中,利用Process類可啟動(dòng)、停止本機(jī)或遠(yuǎn)程進(jìn)程。線程進(jìn)從程序?qū)崿F(xiàn)的角度來說,將一個(gè)進(jìn)程劃分為若干個(gè)獨(dú)立的執(zhí)行流,每個(gè)獨(dú)立的執(zhí)行流都稱為一個(gè)線程。一個(gè)進(jìn)程中既可以只包含一個(gè)線程,也可以同時(shí)包含多個(gè)線程。53.1.1基本概念邏輯內(nèi)核數(shù)利用System.Environment類提供的靜態(tài)ProcessorCount屬性,可獲取本機(jī)可用邏輯內(nèi)核的數(shù)量。例如:StringBuildersb=newStringBuilder();sb.AppendLine("本機(jī)處理器數(shù):"+Environment.ProcessorCount);sb.AppendLine("是否為64位操作系統(tǒng):"+Environment.Is64BitOperatingSystem);sb.AppendLine("當(dāng)前進(jìn)程是否為64位進(jìn)程:"+Environment.Is64BitProcess);sb.AppendFormat("\n當(dāng)前進(jìn)程占用的物理內(nèi)存量:{3:#.##}MB",Environment.WorkingSet/1024.0/1024.0);MessageBox.Show(sb.ToString());3.1.2
進(jìn)程管理(Process類)System.Diagnostics命名空間下的Process類提供了在操作系統(tǒng)級(jí)別對(duì)進(jìn)程進(jìn)行管理的各種屬性和方法。利用Process類,可以啟動(dòng)和停止本機(jī)進(jìn)程、獲取或設(shè)置進(jìn)程優(yōu)先級(jí)、確定進(jìn)程是否響應(yīng)、是否已經(jīng)退出,以及獲取系統(tǒng)正在運(yùn)行的所有進(jìn)程列表和各進(jìn)程的資源占用情況等。Process類也可查詢遠(yuǎn)程計(jì)算機(jī)上進(jìn)程的相關(guān)信息,包括進(jìn)程內(nèi)的線程集合、加載的模塊(.dll文件和.exe文件)和性能信息(如進(jìn)程當(dāng)前使用的內(nèi)存量等)。3.1.2
進(jìn)程管理(Process類)啟動(dòng)進(jìn)程啟動(dòng)某個(gè)進(jìn)程首先需要?jiǎng)?chuàng)建Process類的一個(gè)實(shí)例,并通過StartInfo屬性指定要運(yùn)行的應(yīng)用程序名稱以及傳遞的參數(shù),然后調(diào)用該實(shí)例的Start方法啟動(dòng)該進(jìn)程。進(jìn)程帶有圖形用戶界面可用ProcessWindowStyle枚舉指定啟動(dòng)進(jìn)程時(shí)如何顯示窗口??蛇x的枚舉值有:Normal(正常窗口)、Hidden(隱藏窗口)、Minimized(最小化窗口)和Maximized(最大化窗口)
3.1.2
進(jìn)程管理(Process類)停止進(jìn)程Kill方法和CloseMainWindow方法前者用于強(qiáng)行終止進(jìn)程,后者只是“請(qǐng)求”終止進(jìn)程。HasExited屬性HasExited屬性用于判斷啟動(dòng)的進(jìn)程是否已停止運(yùn)行。WaitForInputIdle方法WaitForInputIdle方法僅適用于具有用戶界面的進(jìn)程,它可以使Process等待關(guān)聯(lián)進(jìn)程進(jìn)入空閑狀態(tài)。3.1.2
進(jìn)程管理(Process類)停止進(jìn)程WaitForExit方法WaitForExit方法可設(shè)置等待關(guān)聯(lián)進(jìn)程退出的時(shí)間,并在該段時(shí)間結(jié)束前或該進(jìn)程退出前,阻止當(dāng)前線程執(zhí)行。ExitCode屬性和ExitTime屬性ExitCode屬性用于獲取關(guān)聯(lián)進(jìn)程終止時(shí)指定的值,ExitTime屬性用于獲取關(guān)聯(lián)進(jìn)程退出的時(shí)間。EnableRaisingEvents屬性EnableRaisingEvents屬性用于獲取或設(shè)置在進(jìn)程終止時(shí)是否應(yīng)引發(fā)Exited事件。3.1.2
進(jìn)程管理(Process類)獲取所有進(jìn)程信息Process靜態(tài)的GetProcesses方法用于創(chuàng)建新的Process數(shù)組,并將該數(shù)組與本地計(jì)算機(jī)上的所有進(jìn)程資源相關(guān)聯(lián)。例如://獲取本機(jī)所有進(jìn)程Process[]myProcesses=Process.GetProcesses();//獲取網(wǎng)絡(luò)上遠(yuǎn)程計(jì)算機(jī)的所有進(jìn)程Process[]myProcesses=Process.GetProcesses("");
注意使用GetProcesses方法時(shí),所獲取的進(jìn)程是否是用Start方法啟動(dòng)的。3.1.2
進(jìn)程管理(Process類)獲取指定進(jìn)程信息Process靜態(tài)的GetProcessById方法會(huì)自動(dòng)創(chuàng)建Process對(duì)象,并將其與本地計(jì)算機(jī)上的進(jìn)程相關(guān)聯(lián),同時(shí)將進(jìn)程Id傳遞給該P(yáng)rocess對(duì)象。Process靜態(tài)的GetProcessesByName方法返回一個(gè)包含所有關(guān)聯(lián)進(jìn)程的數(shù)組,得到該數(shù)組后,可以再依次查詢這些進(jìn)程中的每一個(gè)標(biāo)識(shí)符,從而得到與該進(jìn)程相關(guān)的更多信息。3.1.3線程管理(Thread類)主線程和輔助線程無論是控制臺(tái)應(yīng)用程序、WinForm應(yīng)用程序、WPF應(yīng)用程序還是其他類型的應(yīng)用程序,當(dāng)將這些程序作為進(jìn)程來運(yùn)行時(shí),系統(tǒng)都會(huì)為該進(jìn)程創(chuàng)建一個(gè)默認(rèn)的線程,該線程稱為主線程?;蛘哒f,主線程用于執(zhí)行Main方法中的代碼,當(dāng)Main方法返回時(shí),主線程也自動(dòng)終止。在一個(gè)進(jìn)程中,除了主線程之外的其他線程都稱為輔助線程。3.1.3線程管理(Thread類)前臺(tái)線程與后臺(tái)線程一個(gè)線程要么是前臺(tái)線程要么是后臺(tái)線程。區(qū)別:后臺(tái)線程不會(huì)影響進(jìn)程的終止,而前臺(tái)線程則會(huì)影響進(jìn)程的終止。創(chuàng)建線程
通過Thread對(duì)象可創(chuàng)建一個(gè)單獨(dú)的線程。線程是通過委托來實(shí)現(xiàn)的,至于使用哪種委托,要看定義的方法是否帶參數(shù)。用Thread創(chuàng)建的線程默認(rèn)為前臺(tái)線程,如果希望將其作為后臺(tái)線程,可將IsBackground屬性設(shè)置為true。3.1.3線程管理(Thread類)啟動(dòng)線程用Thread創(chuàng)建線程的實(shí)例后,即可調(diào)用該實(shí)例的Start方法啟動(dòng)該線程。在當(dāng)前線程中調(diào)用Start方法啟動(dòng)另一個(gè)線程后,當(dāng)前線程會(huì)繼續(xù)執(zhí)行其后面的代碼。當(dāng)將方法作為一個(gè)單獨(dú)的線程執(zhí)行時(shí),如果方法帶有參數(shù),只能在啟動(dòng)線程時(shí)傳遞實(shí)參,而且定義該方法的參數(shù)只能是一個(gè)Object類型。3.1.3線程管理(Thread類)終止或取消線程的執(zhí)行第1種方法是先設(shè)置一個(gè)修飾符為volatile的布爾型的字段表示是否需要正常結(jié)束該線程,稱為終止線程。第2種方法是在其他線程中調(diào)用Thread實(shí)例的Abort方法終止當(dāng)前線程,該方法的最終效果是強(qiáng)行終止該線程的執(zhí)行,屬于非正常終止的情況,稱為取消線程的執(zhí)行。休眠線程調(diào)用Thread類提供的靜態(tài)Sleep方法,可使當(dāng)前線程暫停一段時(shí)間。注意無法從一個(gè)線程中暫停其他的線程。3.1.3線程管理(Thread類)獲取或設(shè)置線程的優(yōu)先級(jí)每個(gè)線程都具有分配給它的優(yōu)先級(jí)。當(dāng)線程之間爭奪CPU時(shí)間片時(shí),CPU是按照線程的優(yōu)先級(jí)進(jìn)行調(diào)度的。創(chuàng)建線程時(shí),默認(rèn)優(yōu)先級(jí)為Normal。使用下面的方法可為線程賦予較高的優(yōu)先級(jí):Threadt1=newThread(MethodName);t1.priority=ThreadPriority.AboveNormal;注意使用最高優(yōu)先級(jí)時(shí)要特別小心。3.1.4線程池(ThreadPool類)線程池的基本特征托管線程池中的線程都是后臺(tái)線程。添加到線程池中的任務(wù)不一定會(huì)立即執(zhí)行。線程池可自動(dòng)重用已創(chuàng)建過的線程。一旦池中的某個(gè)線程完成任務(wù),它將返回到等待線程隊(duì)列中,等待被再次使用,而不是直接銷毀它。開發(fā)人員可設(shè)置線程池的最大線程數(shù)。從.NET框架4.0開始,線程池的默認(rèn)大小由多個(gè)因素決定。從.NET框架4.0開始,線程池中的線程都是利用多核處理技術(shù)來實(shí)現(xiàn)的。3.1.4線程池(ThreadPool類)向線程池中添加工作項(xiàng)在傳統(tǒng)的編程模型中,開發(fā)人員一般是直接用ThreadPool.QueueUserWorkItem方法向線程池中添加工作項(xiàng)。ThreadPool.QueueUserWorkItem(newWaitCallback(Method1));ThreadPool.QueueUserWorkItem(newWaitCallback(Method2));ThreadPool只提供了一些靜態(tài)方法,不能通過創(chuàng)建該類的實(shí)例來使用線程池。3.1.5線程池多線程編程中的資源同步同步執(zhí)行和異步執(zhí)行一種是執(zhí)行某語句時(shí),在該語句完成之前不會(huì)執(zhí)行其后面的代碼,這種執(zhí)行方式稱為同步執(zhí)行。一種是執(zhí)行某語句時(shí),不管該語句是否完成,都會(huì)繼續(xù)執(zhí)行其后面的語句,這種執(zhí)行方式稱為異步執(zhí)行。多線程執(zhí)行過程中的資源同步問題在某個(gè)線程中啟動(dòng)另一個(gè)或多個(gè)線程后,這些線程會(huì)同時(shí)執(zhí)行,稱為并行。并行執(zhí)行的多個(gè)線程同時(shí)訪問某些資源時(shí),必須考慮如何讓多個(gè)線程保持同步。3.1.5線程池多線程編程中的資源同步死鎖和爭用情況死鎖的典型例子是兩個(gè)線程都停止響應(yīng),并且都在等待對(duì)方完成,從而導(dǎo)致任何一個(gè)線程都不能繼續(xù)執(zhí)行。為了解決死鎖問題,C#和.NET框架都提供了多種協(xié)調(diào)線程同步的方案。實(shí)現(xiàn)資源同步的常用方式用volatile修飾符鎖定公共或私有字段。利用該修飾符可直接訪問內(nèi)存中的字段,而不是將字段緩存在某個(gè)處理器的寄存器中。這樣做的好處是所有處理器都可以訪問該字段最新的值。
3.1.5線程池多線程編程中的資源同步用Interlocked類提供的靜態(tài)方法鎖定局部變量。System.Threading.Interlocked類通過加鎖和解鎖提供了原子級(jí)別的靜態(tài)操作方法,對(duì)并行執(zhí)行過程中的某個(gè)局部變量進(jìn)行操作時(shí),可采用這種辦法實(shí)現(xiàn)同步。鎖定局部變量的另一種實(shí)現(xiàn)方式是直接用C#提供的lock語句將包含局部變量的代碼塊鎖定,退出被鎖定的代碼塊后會(huì)自動(dòng)解鎖。用lock語句鎖定代碼塊C#提供了一個(gè)lock語句,該語句能確保當(dāng)一個(gè)線程完成執(zhí)行代碼塊之前,不會(huì)被其他線程中斷。被鎖定的代碼塊稱為臨界區(qū)。lock語句的實(shí)現(xiàn)原理是進(jìn)入臨界區(qū)之前先鎖定某個(gè)私有對(duì)象(聲明為private的對(duì)象),然后再執(zhí)行臨界區(qū)中的代碼,當(dāng)代碼塊中的語句執(zhí)行完畢后,再自動(dòng)解除該鎖。
3.1.5線程池多線程編程中的資源同步如果鎖定的代碼段中包含多個(gè)需要同步的字段或者多個(gè)局部變量,可先定義一個(gè)私有字段lockedObj,通過一次性鎖定該私有字段實(shí)現(xiàn)多個(gè)變量的同步操作。注意:使用lock語句時(shí),臨界區(qū)中的代碼一般不宜太多,這是因?yàn)殒i定一個(gè)私有對(duì)象之后,在解鎖該對(duì)象之前,其他任何線程都不能執(zhí)行l(wèi)ock語句所包含的代碼塊中的內(nèi)容,如果在鎖定和解鎖期間處理的代碼過多,則在某個(gè)線程執(zhí)行臨界區(qū)中的代碼時(shí),其他等待運(yùn)行臨界區(qū)中代碼的線程都會(huì)處于阻塞狀態(tài),這樣不但無法體現(xiàn)多線程的優(yōu)點(diǎn),反而會(huì)降低應(yīng)用程序的性能。3.1.6
WPF中的多線程編程模型WPF調(diào)度器(Dispatcher)默認(rèn)情況下,.NET框架都不允許在一個(gè)線程中直接訪問另一個(gè)線程中的控件。為了解決死鎖以及異步執(zhí)行過程中的同步問題,WPF中的每個(gè)元素(包括根元素)都有一個(gè)Dispatcher屬性。要在后臺(tái)線程中與用戶界面交互,可以通過向WPF控件的Dispatcher注冊(cè)工作項(xiàng)來完成。注冊(cè)工作項(xiàng)的常用方法有兩種:Invoke方法和InvokeAsync方法。Invoke方法是同步調(diào)用,即直到在線程池中實(shí)際執(zhí)行完該委托它才返回。Dispatcher.Invoke方法的重載形式的多樣化。3.2應(yīng)用程序域及其基本操作3.2.1基本概念3.2.2程序集與反射3.2.3創(chuàng)建和卸載應(yīng)用程序域(AppDomain類)3.2.1
基本概念定義:一個(gè)主進(jìn)程中,可包含一個(gè)或多個(gè)“子進(jìn)程”,每個(gè)“子進(jìn)程”所占用的內(nèi)存范圍(或者叫邊界)都稱為一個(gè)應(yīng)用程序域。應(yīng)用程序域與線程的關(guān)系應(yīng)用程序域?yàn)榘踩?、版本控制、可靠性和托管代碼的卸載形成隔離邊界,執(zhí)行應(yīng)用程序時(shí),所有托管代碼均加載到一個(gè)應(yīng)用程序域中,由一個(gè)或多個(gè)托管線程來運(yùn)行。應(yīng)用程序域和線程之間不具有一對(duì)一的相關(guān)性。應(yīng)用程序域之間是相互隔離的,一個(gè)應(yīng)用程序域無法直接訪問另一個(gè)應(yīng)用程序域的資源。3.2.1
基本概念應(yīng)用程序域與進(jìn)程的關(guān)系可將應(yīng)用程序進(jìn)程中的每個(gè)應(yīng)用程序域都看作是一個(gè)“子進(jìn)程”。一個(gè)進(jìn)程既可以只包含一個(gè)應(yīng)用程序域,也可以同時(shí)包含多個(gè)相互隔離的應(yīng)用程序域。多進(jìn)程是操作系統(tǒng)級(jí)別使用的功能,資源消耗較大,細(xì)節(jié)控制復(fù)雜;應(yīng)用程序域是在應(yīng)用程序級(jí)別使用的功能,比直接用多進(jìn)程來實(shí)現(xiàn)進(jìn)程管理速度快、資源消耗少而且更安全,是為應(yīng)用程序開發(fā)人員提供的輕量級(jí)的進(jìn)程管理。3.2.1
基本概念什么時(shí)候使用應(yīng)用程序域當(dāng)需要?jiǎng)討B(tài)擴(kuò)展程序的功能時(shí),可將其他進(jìn)程(.dll文件或者.exe文件)中的全部或部分功能“嵌入”到當(dāng)前應(yīng)用程序進(jìn)程界面中,使其看起來就像是同一個(gè)應(yīng)用程序一樣(多進(jìn)程則無法做到這一點(diǎn)),而且這種實(shí)現(xiàn)方式比用多進(jìn)程實(shí)現(xiàn)的運(yùn)行速度快。在同一個(gè)進(jìn)程內(nèi),實(shí)現(xiàn)不同域之間的通信比用多進(jìn)程實(shí)現(xiàn)簡單。在安全性方面,用應(yīng)用程序域來實(shí)現(xiàn)比用多進(jìn)程來實(shí)現(xiàn)更有保障。3.2.2程序集與反射程序集程序集(Assembly)是.NET框架應(yīng)用程序的生成塊,它為公共語言運(yùn)行庫(CLR)提供了識(shí)別和實(shí)現(xiàn)類型(class)所需要的信息。程序集包含模塊(Model),模塊包含類型(class),類型又包含成員(屬性、方法、字段等)。程序集是為協(xié)同工作而生成的類型(class)和資源(如圖像文件等)的集合,這些類型和資源共同構(gòu)成了應(yīng)用程序部署、版本控制、重復(fù)使用、激活范圍控制和安全權(quán)限的基本邏輯功能單元。3.2.2程序集與反射反射Type類System命名空間下有一個(gè)Type類,該類對(duì)反射起著核心的作用。程序員可以用Type對(duì)象的方法、字段、屬性和嵌套類來查找有關(guān)該類型的所有信息。有兩種獲取程序集中指定類型的辦法:使用C#提供的typeof關(guān)鍵字獲取指定類型的Type對(duì)象。調(diào)用Type類的GetType靜態(tài)方法獲取指定類型的Type對(duì)象。Type類提供的大多數(shù)方法都可以獲取指定數(shù)據(jù)類型的成員信息。3.2.2程序集與反射Assembly類Assembly類是在System.Reflection命名空間中定義的,利用它可訪問給定程序集的元數(shù)據(jù),并包含可以執(zhí)行一個(gè)程序集的方法。元數(shù)據(jù)是一種二進(jìn)制信息,用以對(duì)存儲(chǔ)在公共語言運(yùn)行庫中可移植的可執(zhí)行文件或存儲(chǔ)在內(nèi)存中的程序進(jìn)行描述。Assembly類提供有一個(gè)靜態(tài)的Load方法,該方法可加載程序集。3.2.3創(chuàng)建和卸載應(yīng)用程序域常用屬性CurrentDomain屬性(靜態(tài)屬性),該屬性可獲取當(dāng)前線程所在的應(yīng)用程序域。BaseDirectory屬性,該屬性可獲取域所在的應(yīng)用程序的基目錄,即該應(yīng)用程序的根目錄。常用方法CreateDomain方法
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024物業(yè)公司承擔(dān)住宅小區(qū)垃圾清運(yùn)的合同
- 2025年度留置車輛處置借款合同4篇
- 2025年grc構(gòu)件生產(chǎn)線投資建設(shè)與運(yùn)營合同3篇
- 年度PAPTFE競爭策略分析報(bào)告
- 年度童書產(chǎn)業(yè)分析報(bào)告
- 2024-2025學(xué)年新教材高中語文基礎(chǔ)過關(guān)訓(xùn)練15諫逐客書含解析部編版必修下冊(cè)
- 二零二五版白糖倉儲(chǔ)物流服務(wù)合同范本2篇
- 2025年理療項(xiàng)目合作協(xié)議范本:特色理療項(xiàng)目合作框架協(xié)議3篇
- 2025年度中小企業(yè)間資金周轉(zhuǎn)互助合同范本
- 二零二五年度商業(yè)地產(chǎn)租賃合同中情勢變更處理辦法及責(zé)任劃分4篇
- 骨科手術(shù)后患者營養(yǎng)情況及營養(yǎng)不良的原因分析,骨傷科論文
- GB/T 24474.1-2020乘運(yùn)質(zhì)量測量第1部分:電梯
- GB/T 12684-2006工業(yè)硼化物分析方法
- 定崗定編定員實(shí)施方案(一)
- 高血壓患者用藥的注意事項(xiàng)講義課件
- 特種作業(yè)安全監(jiān)護(hù)人員培訓(xùn)課件
- (完整)第15章-合成生物學(xué)ppt
- 太平洋戰(zhàn)爭課件
- 封條模板A4打印版
- T∕CGCC 7-2017 焙烤食品用糖漿
- 貨代操作流程及規(guī)范
評(píng)論
0/150
提交評(píng)論