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