




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
工业和信息化部“十二五”规划教材
普通高等学校“十二五”规划教材
《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基本概念进程进程是操作系统级别的一个基本概念,可以将其简单地理解为“正在运行的程序”。进程之间是相互独立的。在操作系统级别的管理中,利用Process类可启动、停止本机或远程进程。线程进从程序实现的角度来说,将一个进程划分为若干个独立的执行流,每个独立的执行流都称为一个线程。一个进程中既可以只包含一个线程,也可以同时包含多个线程。53.1.1基本概念逻辑内核数利用System.Environment类提供的静态ProcessorCount属性,可获取本机可用逻辑内核的数量。例如:StringBuildersb=newStringBuilder();sb.AppendLine("本机处理器数:"+Environment.ProcessorCount);sb.AppendLine("是否为64位操作系统:"+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类提供了在操作系统级别对进程进行管理的各种属性和方法。利用Process类,可以启动和停止本机进程、获取或设置进程优先级、确定进程是否响应、是否已经退出,以及获取系统正在运行的所有进程列表和各进程的资源占用情况等。Process类也可查询远程计算机上进程的相关信息,包括进程内的线程集合、加载的模块(.dll文件和.exe文件)和性能信息(如进程当前使用的内存量等)。3.1.2
进程管理(Process类)启动进程启动某个进程首先需要创建Process类的一个实例,并通过StartInfo属性指定要运行的应用程序名称以及传递的参数,然后调用该实例的Start方法启动该进程。进程带有图形用户界面可用ProcessWindowStyle枚举指定启动进程时如何显示窗口。可选的枚举值有:Normal(正常窗口)、Hidden(隐藏窗口)、Minimized(最小化窗口)和Maximized(最大化窗口)
3.1.2
进程管理(Process类)停止进程Kill方法和CloseMainWindow方法前者用于强行终止进程,后者只是“请求”终止进程。HasExited属性HasExited属性用于判断启动的进程是否已停止运行。WaitForInputIdle方法WaitForInputIdle方法仅适用于具有用户界面的进程,它可以使Process等待关联进程进入空闲状态。3.1.2
进程管理(Process类)停止进程WaitForExit方法WaitForExit方法可设置等待关联进程退出的时间,并在该段时间结束前或该进程退出前,阻止当前线程执行。ExitCode属性和ExitTime属性ExitCode属性用于获取关联进程终止时指定的值,ExitTime属性用于获取关联进程退出的时间。EnableRaisingEvents属性EnableRaisingEvents属性用于获取或设置在进程终止时是否应引发Exited事件。3.1.2
进程管理(Process类)获取所有进程信息Process静态的GetProcesses方法用于创建新的Process数组,并将该数组与本地计算机上的所有进程资源相关联。例如://获取本机所有进程Process[]myProcesses=Process.GetProcesses();//获取网络上远程计算机的所有进程Process[]myProcesses=Process.GetProcesses("");
注意使用GetProcesses方法时,所获取的进程是否是用Start方法启动的。3.1.2
进程管理(Process类)获取指定进程信息Process静态的GetProcessById方法会自动创建Process对象,并将其与本地计算机上的进程相关联,同时将进程Id传递给该Process对象。Process静态的GetProcessesByName方法返回一个包含所有关联进程的数组,得到该数组后,可以再依次查询这些进程中的每一个标识符,从而得到与该进程相关的更多信息。3.1.3线程管理(Thread类)主线程和辅助线程无论是控制台应用程序、WinForm应用程序、WPF应用程序还是其他类型的应用程序,当将这些程序作为进程来运行时,系统都会为该进程创建一个默认的线程,该线程称为主线程。或者说,主线程用于执行Main方法中的代码,当Main方法返回时,主线程也自动终止。在一个进程中,除了主线程之外的其他线程都称为辅助线程。3.1.3线程管理(Thread类)前台线程与后台线程一个线程要么是前台线程要么是后台线程。区别:后台线程不会影响进程的终止,而前台线程则会影响进程的终止。创建线程
通过Thread对象可创建一个单独的线程。线程是通过委托来实现的,至于使用哪种委托,要看定义的方法是否带参数。用Thread创建的线程默认为前台线程,如果希望将其作为后台线程,可将IsBackground属性设置为true。3.1.3线程管理(Thread类)启动线程用Thread创建线程的实例后,即可调用该实例的Start方法启动该线程。在当前线程中调用Start方法启动另一个线程后,当前线程会继续执行其后面的代码。当将方法作为一个单独的线程执行时,如果方法带有参数,只能在启动线程时传递实参,而且定义该方法的参数只能是一个Object类型。3.1.3线程管理(Thread类)终止或取消线程的执行第1种方法是先设置一个修饰符为volatile的布尔型的字段表示是否需要正常结束该线程,称为终止线程。第2种方法是在其他线程中调用Thread实例的Abort方法终止当前线程,该方法的最终效果是强行终止该线程的执行,属于非正常终止的情况,称为取消线程的执行。休眠线程调用Thread类提供的静态Sleep方法,可使当前线程暂停一段时间。注意无法从一个线程中暂停其他的线程。3.1.3线程管理(Thread类)获取或设置线程的优先级每个线程都具有分配给它的优先级。当线程之间争夺CPU时间片时,CPU是按照线程的优先级进行调度的。创建线程时,默认优先级为Normal。使用下面的方法可为线程赋予较高的优先级:Threadt1=newThread(MethodName);t1.priority=ThreadPriority.AboveNormal;注意使用最高优先级时要特别小心。3.1.4线程池(ThreadPool类)线程池的基本特征托管线程池中的线程都是后台线程。添加到线程池中的任务不一定会立即执行。线程池可自动重用已创建过的线程。一旦池中的某个线程完成任务,它将返回到等待线程队列中,等待被再次使用,而不是直接销毁它。开发人员可设置线程池的最大线程数。从.NET框架4.0开始,线程池的默认大小由多个因素决定。从.NET框架4.0开始,线程池中的线程都是利用多核处理技术来实现的。3.1.4线程池(ThreadPool类)向线程池中添加工作项在传统的编程模型中,开发人员一般是直接用ThreadPool.QueueUserWorkItem方法向线程池中添加工作项。ThreadPool.QueueUserWorkItem(newWaitCallback(Method1));ThreadPool.QueueUserWorkItem(newWaitCallback(Method2));ThreadPool只提供了一些静态方法,不能通过创建该类的实例来使用线程池。3.1.5线程池多线程编程中的资源同步同步执行和异步执行一种是执行某语句时,在该语句完成之前不会执行其后面的代码,这种执行方式称为同步执行。一种是执行某语句时,不管该语句是否完成,都会继续执行其后面的语句,这种执行方式称为异步执行。多线程执行过程中的资源同步问题在某个线程中启动另一个或多个线程后,这些线程会同时执行,称为并行。并行执行的多个线程同时访问某些资源时,必须考虑如何让多个线程保持同步。3.1.5线程池多线程编程中的资源同步死锁和争用情况死锁的典型例子是两个线程都停止响应,并且都在等待对方完成,从而导致任何一个线程都不能继续执行。为了解决死锁问题,C#和.NET框架都提供了多种协调线程同步的方案。实现资源同步的常用方式用volatile修饰符锁定公共或私有字段。利用该修饰符可直接访问内存中的字段,而不是将字段缓存在某个处理器的寄存器中。这样做的好处是所有处理器都可以访问该字段最新的值。
3.1.5线程池多线程编程中的资源同步用Interlocked类提供的静态方法锁定局部变量。System.Threading.Interlocked类通过加锁和解锁提供了原子级别的静态操作方法,对并行执行过程中的某个局部变量进行操作时,可采用这种办法实现同步。锁定局部变量的另一种实现方式是直接用C#提供的lock语句将包含局部变量的代码块锁定,退出被锁定的代码块后会自动解锁。用lock语句锁定代码块C#提供了一个lock语句,该语句能确保当一个线程完成执行代码块之前,不会被其他线程中断。被锁定的代码块称为临界区。lock语句的实现原理是进入临界区之前先锁定某个私有对象(声明为private的对象),然后再执行临界区中的代码,当代码块中的语句执行完毕后,再自动解除该锁。
3.1.5线程池多线程编程中的资源同步如果锁定的代码段中包含多个需要同步的字段或者多个局部变量,可先定义一个私有字段lockedObj,通过一次性锁定该私有字段实现多个变量的同步操作。注意:使用lock语句时,临界区中的代码一般不宜太多,这是因为锁定一个私有对象之后,在解锁该对象之前,其他任何线程都不能执行lock语句所包含的代码块中的内容,如果在锁定和解锁期间处理的代码过多,则在某个线程执行临界区中的代码时,其他等待运行临界区中代码的线程都会处于阻塞状态,这样不但无法体现多线程的优点,反而会降低应用程序的性能。3.1.6
WPF中的多线程编程模型WPF调度器(Dispatcher)默认情况下,.NET框架都不允许在一个线程中直接访问另一个线程中的控件。为了解决死锁以及异步执行过程中的同步问题,WPF中的每个元素(包括根元素)都有一个Dispatcher属性。要在后台线程中与用户界面交互,可以通过向WPF控件的Dispatcher注册工作项来完成。注册工作项的常用方法有两种:Invoke方法和InvokeAsync方法。Invoke方法是同步调用,即直到在线程池中实际执行完该委托它才返回。Dispatcher.Invoke方法的重载形式的多样化。3.2应用程序域及其基本操作3.2.1基本概念3.2.2程序集与反射3.2.3创建和卸载应用程序域(AppDomain类)3.2.1
基本概念定义:一个主进程中,可包含一个或多个“子进程”,每个“子进程”所占用的内存范围(或者叫边界)都称为一个应用程序域。应用程序域与线程的关系应用程序域为安全性、版本控制、可靠性和托管代码的卸载形成隔离边界,执行应用程序时,所有托管代码均加载到一个应用程序域中,由一个或多个托管线程来运行。应用程序域和线程之间不具有一对一的相关性。应用程序域之间是相互隔离的,一个应用程序域无法直接访问另一个应用程序域的资源。3.2.1
基本概念应用程序域与进程的关系可将应用程序进程中的每个应用程序域都看作是一个“子进程”。一个进程既可以只包含一个应用程序域,也可以同时包含多个相互隔离的应用程序域。多进程是操作系统级别使用的功能,资源消耗较大,细节控制复杂;应用程序域是在应用程序级别使用的功能,比直接用多进程来实现进程管理速度快、资源消耗少而且更安全,是为应用程序开发人员提供的轻量级的进程管理。3.2.1
基本概念什么时候使用应用程序域当需要动态扩展程序的功能时,可将其他进程(.dll文件或者.exe文件)中的全部或部分功能“嵌入”到当前应用程序进程界面中,使其看起来就像是同一个应用程序一样(多进程则无法做到这一点),而且这种实现方式比用多进程实现的运行速度快。在同一个进程内,实现不同域之间的通信比用多进程实现简单。在安全性方面,用应用程序域来实现比用多进程来实现更有保障。3.2.2程序集与反射程序集程序集(Assembly)是.NET框架应用程序的生成块,它为公共语言运行库(CLR)提供了识别和实现类型(class)所需要的信息。程序集包含模块(Model),模块包含类型(class),类型又包含成员(属性、方法、字段等)。程序集是为协同工作而生成的类型(class)和资源(如图像文件等)的集合,这些类型和资源共同构成了应用程序部署、版本控制、重复使用、激活范围控制和安全权限的基本逻辑功能单元。3.2.2程序集与反射反射Type类System命名空间下有一个Type类,该类对反射起着核心的作用。程序员可以用Type对象的方法、字段、属性和嵌套类来查找有关该类型的所有信息。有两种获取程序集中指定类型的办法:使用C#提供的typeof关键字获取指定类型的Type对象。调用Type类的GetType静态方法获取指定类型的Type对象。Type类提供的大多数方法都可以获取指定数据类型的成员信息。3.2.2程序集与反射Assembly类Assembly类是在System.Reflection命名空间中定义的,利用它可访问给定程序集的元数据,并包含可以执行一个程序集的方法。元数据是一种二进制信息,用以对存储在公共语言运行库中可移植的可执行文件或存储在内存中的程序进行描述。Assembly类提供有一个静态的Load方法,该方法可加载程序集。3.2.3创建和卸载应用程序域常用属性CurrentDomain属性(静态属性),该属性可获取当前线程所在的应用程序域。BaseDirectory属性,该属性可获取域所在的应用程序的基目录,即该应用程序的根目录。常用方法CreateDomain方法
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 建筑行业的工程进度管理计划
- 职业技能提升计划的实施路径
- 会计行业发展趋势的分析计划
- 提高幼儿园教育活动的参与感计划
- 感知美好生活的艺术活动计划
- 《贵州安晟能源有限公司贵州省大方县对江井田煤矿(新建)矿产资源绿色开发利用方案(三合一)》专家组评审意见
- 四川省宜宾市南溪二中高二体育《运球、双手胸前传接球》教学实录
- 艾灸治疗便秘
- 2025年红河货运从业资格证考试模拟考试题库下载
- 2025年武汉货运驾驶从业资格证考试题库
- 客户来访登记表
- 日产新轩逸电子手册cvt
- 人教八年级下册英语U5Do-you-remember-what-you-were-doing?课件
- 2009-2022历年上海市公安机关勤务辅警招聘考试《职业能力倾向测验》真题含答案2022-2023上岸必备汇编3
- 小学人教版四年级下册数学租船问题25题
- 大连市小升初手册
- 医疗垃圾管理及手卫生培训PPT课件
- 吓数基础知识共20
- 锂电池安全知识培训-课件
- 电子产品高可靠性装联工艺下
- 越南北部工业区资料(1060707)
评论
0/150
提交评论