第03章-进程、线程与应用程序域

  • 格式:ppt
  • 大小:369.50 KB
  • 文档页数:35

下载文档原格式

  / 35
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MessageBox.Show(sb.ToString());
5
3.1.2 进程管理(Process类)
System.Diagnostics命名空间下的Process类提供了在操作 系统级别对进程进行管理的各种属性和方法。利用Process类, 可以启动和停止本机进程、获取或设置进程优先级、确定进程 是否响应、是否已经退出,以及获取系统正在运行的所有进程 列表和各进程的资源占用情况等。 Process类也可查询远程计算机上进程的相关信息,包括进程 内的线程集合、加载的模块(.dll文件和.exe文件)和性能信息 (如进程当前使用的内存量等)。
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( );
为private的对象),然后再执行临界区中的代码,当代码块中的语 句执行完毕后,再自动解除该锁。
3.1.5 线程池多线程编程中的资源同步
如果锁定的代码段中包含多个需要同步的字段或者多个局部变量,
可先定义一个私有字段lockedObj,通过一次性锁定该私有字段实现 多个变量的同步操作。
注意:使用lock语句时,临界区中的代码一般不宜太多, 这是因为锁定一个私有对象之后,在解锁该对象之前,其 他任何线程都不能执行lock语句所包含的代码块中的内容 ,如果在锁定和解锁期间处理的代码过多,则在某个线程 执行临界区中的代码时,其他等待运行临界区中代码的线 程都会处于阻塞状态,这样不但无法体现多线程的优点, 反而会降低应用程序的性能。
3.1.3 线程管理(Thread类)
终止或取消线程的执行
第1种方法是先设臵一个修饰符为volatile的布尔型的字段 表示是否需要正常结束该线程,称为终止线程。
第2种方法是在其他线程中调用Thread实例的Abort方法终 止当前线程,该方法的最终效果是强行终止该线程的执行 ,属于非正常终止的情况,称为取消线程的执行。 休眠线程 调用Thread类提供的静态Sleep方法,可使当前线程暂停 一段时间。
t1 = new Thread(MethodName);
t1.priority = ThreadPriority.AboveNormal; 注意使用最高优先级时要特别小心。
3.1.4 线程池(ThreadPool类)
线程池的基本特征
托管线程池中的线程都是后台线程。
添加到线程池中的任务不一定会立即执行。 线程池可自动重用已创建过的线程。一旦池中的某个线程 完成任务,它将返回到等待线程队列中,等待被再次使用 ,而不是直接销毁它。 开发人员可设臵线程池的最大线程数。从.NET框架4.0开始 ,线程池的默认大小由多个因素决定。 从.NET框架4.0开始,线程池中的线程都是利用多核处理技 术来实现的。
注意无法从一个线程中暂停其他的线程。
3.1.3 线程管理(Thread类)
获取或设置线程的优先级
每个线程都具有分配给它的优先级。
当线程之间争夺CPU时间片时,CPU是按照线程的优先级 进行调度的。 创建线程时,默认优先级为Normal。 使用下面的方法可为线程赋予较高的优先级:
Thread
注册工作项的常用方法有两种:Invoke方法和InvokeAsync方法。
Invoke方法是同步调用,即直到在线程池中实际执行完该委托
3.1.3 线程管理(Thread类)
主线程和辅助线程
无论是控制台应用程序、WinForm应用程序、WPF应用程 序还是其他类型的应用程序,当将这些程序作为进程来运 行时,系统都会为该进程创建一个默认的线程,该线程称 为主线程。或者说,主线程用于执行Main方法中的代码, 当Main方法返回时,主线程也自动终止。
处理器的寄存器中。这样做的好处是所有处理器都可以访问该字段 最新的值。
3.1.5 线程池多线程编程中的资源同步
用Interlocked类提供的静态方法锁定局部变量。
System.Threading.Interlocked 类通过加锁和解锁提供了原子级别
的静态操作方法,对并行执行过程中的某个局部变量进行操作时, 可采用这种办法实现同步。
//获取网络上远程计算机的所有进程
Process[] myProcesses = Process.GetProcesses("192.168.0.1");
注意使用GetProcesses方法时,所获取的进程是否是用 Start方法启动的。
3.1.2 进程管理(Process类)
获取指定进程信息
WaitCallback(Method1)); WaitCallback(Method2));
ThreadPool只提供了一些静态方法,不能通过创建该类的 实例来使用线程池。
3.1.5 线程池多线程编程中的资源同步
同步执行和异步执行
一种是执行某语句时,在该语句完成之前不会执行其后面 的代码,这种执行方式称为同步执行。
3.1.1 基本概念
进程 进程是操作系统级别的一个基本概念,可以将其简单地理 解为“正在运行的程序”。 进程之间是相互独立的。 在操作系统级别的管理中,利用Process类可启动、停止本 机或远程进程。 线程 进从程序实现的角度来说,将一个进程划分为若干个独立 的执行流,每个独立的执行流都称为一个线程。 一个进程中既可以只包含一个线程,也可以同时包含多个 线程。
死锁和争用情况
死锁的典型例子是两个线程都停止响应,并且都在等待对 方完成,从而导致任何一个线程都不能继续执行。
为了解决死锁问题,C#和.NET框架都提供了多种协调线程 同步的方案。 实现资源同步的常用方式 用volatile修饰符锁定公共或私有字段。
利用该修饰符可直接访问内存中的字段,而不是将字段缓存在某个
用Thread创建的线程默认为前台线程,如果希望将其作为 后台线程,可将IsBackground属性设臵为true。
3.1.3 线程管理(Thread类)
启动线程
用Thread创建线程的实例后,即可调用该实例的Start方法 启动该线程。
在当前线程中调用Start方法启动另一个线程后,当前线程 会继续执行其后面的代码。 当将方法作为一个单独的线程执行时,如果方法带有参数 ,只能在启动线程时传递实参,而且定义该方法的参数只 能是一个Object类型。
3.1.6 WPF中的多线程编程模型
WPF调度器(Dispatcher)
默认情况下,.NET框架都不允许在一个线程中直接访问另 一个线程中的控件。
为了解决死锁以及异步执行过程中的同步问题,WPF中的 每个元素(包括根元素)都有一个Dispatcher属性。 要在后台线程中与用户界面交互,可以通过向WPF控件的 Dispatcher注册工作项来完成。
3.1.2 进程管理(Process类)
启动进程
启动某个进程
首先需要创建Process类的一个实例,并通过StartInfo属
性指定要运行的应用程序名称以及传递的参数,然后调用 该实例的Start方法启动该进程。
进程带有图形用户界面
可用ProcessWindowStyle枚举指定启动进程时如何显示窗
sb.AppendLine("是否为64位操作系统:" + Environment.Is64BitOperatingSystem); sb.AppendLine("当前进程是否为64位进程:" + Environment.Is64BitProcess); sb.AppendFormat("\n当前进程占用的物理内存量:{3:#.##}MB", Environment.WorkingSet / 1024.0 / 1024.0);
锁定局部变量的另一种实现方式是直接用C#提供的lock语句将包含
局部变量的代码块锁定,退出被锁定的代码块后会自动解锁。
用lock语句锁定代码块
C#提供了一个lock语句,该语句能确保当一个线程完成执行代码块
之前,不会被其他线程中断。被锁定的代码块称为临界区。
lock语句的实现原理是进入临界区之前先锁定某个私有对象(声明
在一个进程中,除了主线程之外的其他线程都称为辅助线 程。
3.1.3 线程管理(Thread类)
前台线程与后台线程
一个线程要么是前台线程要么是后台线程。
区别:后台线程不会影响进程的终止,而前台线程则会影 响进程的终止。 创建线程 通过Thread对象可创建一个单独的线程。
线程是通过委托来实现的,至于使用哪种委托,要看定义 的方法是否带参数。
工业和信息化部“十二五”规划教材
普通高等学校“十二五”规划教材 《C#网络应用编程》第3版
第3章 进程、线程与 应用程序域
Ch1 进程、线程与应用程序域
3.1 进程和线程 3.2 应用程序域及其基本操作
2
3.1 进程和线程
3.1.1 基本概念
3.1.2 进程管理(Process类)
3.1.3 线程管理(Thread类) 3.1.4 线程池(ThreadPool类) 3.1.5 多线程编程中的资源同步 3.1.6 WPF中的多线程编程模型
4
3.1.1 基本概念
逻辑内核数 利用System.Environment类提供的静态ProcessorCount 属性,可获取本机可用逻辑内核的数量。例如:
StringBuilder sb = new StringBuilder();
sb.AppendLine("本机处理器数:" + Environment.ProcessorCount);
一种是执行某语句时,不管该语句是否完成,都会继续执 行其后面的语句,这种执行方式称为异步执行。 多线程执行过程中的资源同步问题 在某个线程中启动另一个或多个线程后,这些线程会同时 执行,称为并行。 并行执行的多个线程同时访问某些资源时,必须考虑如何 让多个线程保持同步。
3.1.5 线程池多线程编程中的资源同步
3.1.4 线程池(ThreadPool类)
向线程池中添加工作项
在传统的编程模型中,开发人员一般是直接用 ThreadPool.QueueUserWorkItem方法向线程池中添加工 作项。
ThreadPool.QueueUserWorkItem(new ThreadPool.QueueUserWorkItem(new
口。可选的枚举值有:Normal(正常窗口)、Hidden(隐 藏窗口)、Minimized(最小化窗口)和Maximized(最大 化窗口)
3.1.2 进程管理(Process类)
停止进程
Kill方法和CloseMainWindow方法
前者用于强行终止进程,后者只是“请求”终止进程。
HasExited属性
Process静态的GetProcessById方法会自动创建Process 对象,并将其与本地计算机上的进程相关联,同时将进程Id 传递给该Process对象。
Process静态的GetProcessesByName方法返回一个包含 所有关联进程的数组,得到该数组后,可以再依次查询这 些进程中的每一个标识符,从而得到与该进程相关的更多 信息。