进程简单的说就是一个正在运行的程序,包含了运行该程序所需要的一切资源以及内存分配。线程是进程的基本执行单元,在进程的入口点(类似main())创建的第一个线程称之为主线程。只有一个主线程的进程是线程安全的,因为一个程序中的数据只有一个线程在访问,但是只有一个线程的后果就是,如果实在执行一个复杂的操作时,因为运行的时间太长,对用户来说,就好像是请求没被响应一样。所以可以使用CreateThread()之类的Windows API函数另外产生次线程,每一个次线程都拥有与主线程一样的权限,线程之间相互独立,它们可以同时访问共享数据。拥有多线程会给我们带来一种大量的活动几乎在同一时间内完成,但是事实上,同时运行多个线程需要有多个CPU才行。因为实际上CPU将时间分成一个个的时间片(单位时间),按线程优先级分配时间片,当一个线程的时间片用完之后,它就会被挂起,执行下一个线程,由于时间片非常之短,计算机的运行速度有非常之快,故而导致一些操作看起来似乎是在同时发生响应。因而虽然多线程会相对的加快响应速度,但是线程过多的话性能反而会下降,因为CPU需要时间在线程之间进行转换。使用System.Diagnostics命名空间内定义的类,我们就可以使用编程的方式访问进程,

命名空间类名     作用
Process 提供了访问本地进程和的远程进程的功能,允许通过编程方式开始或结束进程
ProcessModule   代表一个加载到特定进程的模块(dll或者exe),它能代表任何模块(基于com、基于.Net或基于传统C的二进制程序)
ProcessModuleCollection 提供ProcessModule对象的强类型集合
ProcessStartInfo 指点通过Process.Start方法启动进程是使用的一组值
ProcessThread 代表指定进程中的线程。用于诊断一个进程的线程情况,并不用于在进程中创建线程
ProcessThreadCollection 提供ProcessThread对象的强类型集合

其中Process是比较常用的一个类,它提供了用于启动、关闭进程,设定进程优先级,以及获得进程中活动线程的列表并且加载给定进程的模块,下图是有关Process的一部分关键属性:

属性   作用
ExitTime 获取终止进程相关的时间戳
Handle 返回操作系统分配给进程的句柄(由IntPtr表示)。当构建与非托管代码交互的.Net程序时,该属性很有用
Id 获取关联的进程的ID
MachineName  获取关联进程运行的计算机名
MainWindowTitle 获取进程主窗口的标题(如果没有住窗口,则返回空字符串)
Modules 可以访问强类型ProcessModuleCollection,后者表示一组加载到当前进程的模块(dll或者exe)
ProcessName 获取进程的名称(应用程序本身的名称)
Responding 指示进程的用户界面是否响应用户输入(或者当前是否被挂起)
StartTime     获取关联进程开始的时间
Thread  

获取运行在关联进程中的一组线程的设置(由ProcessThread对象的集合表示)

以下则是该类的一些方法:

方法 作用
CloseMainWindow 通过向进程的主窗口发送关闭消息来关闭拥有用户界面的进程
GetCurrentProcess 这个静态方法返回新的Process对象以表示当前活动的进程
GetProcesses   这个静态方法返回运行在给定计算机上的新的Process对象
Kill   立即停止关联的进程
Start   启动一个进程

在使用GetProcesses()方法返回一个Process对象组的时候,使用”.“符号即表示为本机,静态方法Process.GetProcessById通过关联的PID获取特定的进程,但是若是所指定的PID不存在,就会引发异常,还需要记住的是PID肯定不能为0,因为0是用来表示cpu空闲状态的。当使用Process.Modules属性访问ProcessModuleCollection时,可以列举出承载在进程中的所有模块:基于.Net、基于COM、基于传统C的库。还得说一下,模块这个词用于描绘承载于指定进程中的dll或者exe。在使用Kill方法结束进程的时候要注意该进程是否已经被结束,若是已经被结束了,再使用Kill()时,就会报错。

在.Net平台下,可执行程序会承载在一个进程的逻辑分区内,而非托管的程序是直接承载的,这个逻辑分区被命名为应用程序域,一个进程可以承载多个应用程序域,每个应用程序域之间都是相互隔离的,因此如果不使用分布式编程协议(如WCF),运行在某个应用程序域中的应用程序将无法访问其他应用程序中的任何数据,不论是全局的或是静态的。但是操作系统进程却只能承载默认的应用程序域。.NET平台运行我们使用System.AppDomain类,监控应用程序域、在运行时新建应用程序域、向新的应用程序域加载程序集等多种任务。

方法 作用
CreateDomain 该静态方法在当前进程中创建一个新的应用程序域
CreateInstance  在加载程序集到调用的应用程序域时,在外部程序集文件中创建指定类型的新实例
EXecuteAssembly 根据文件名在应用程序中执行程序集
GetAssemblies  获取已经加载到此应用程序域中的.Net程序集
GetCurrentThreadId   该静态方法返回当前应用程序域上活动的线程Id
Load   动态加载程序集到当前的应用程序域
Unload   该静态方法在进程中卸载指定的应用程序域
属性 作用
BaseDirectory 获取目录路径,程序集解决程序用它来探测程序集
CurrentDomain 该静态属性获取当前执行线程所在的应用程序域
FriendLyName 获取当前应用程序域的友好名称
MonitoringIsEnable 获取或设置一个值,该值指示是否对当前进程启用应用程序域的cpu和内存监控,一旦对进程启用了监控,则无法将其禁用
SetupInformation 获取给定应用程序域的配置信息,表示为一个AppDomainSetup对象
事件 作用
AssemblyLoad 在加载程序集到内存时发生
AssemblyResolve 在对程序集的解析失败时发生
DomainUnload 在即将从主进程中卸载AppDomain时发生
FirstChanceException 在应用程序域抛出异常时,该事件将在CLR找到合适的catch语句之前触发
ProcessExit 当默认应用程序的父进程退出时,在默认应用程序域上发生
UnhandledException 在异常处理程序未捕捉到异常时

应用程序域再次分出上下文边界用于存放对象,见书本P525

http://www.cnblogs.com/leslies2/archive/2012/03/06/2379235.html#c

《精通C#》第十七章的更多相关文章

  1. 进击的Python【第十七章】:jQuery的基本应用

    进击的Python[第十七章]:jQuery的基本应用

  2. <构建之法>第十三章到十七章有感以及这个项目读后感

    <构建之法>第十三章到十七章有感 第13章:软件测试方法有哪些? 主要讲了软件测试方法:要说有什么问题就是哪种效率最高? 第14章:质量保障 软件的质量指标是什么?怎么样能够提升软件的质量 ...

  3. 程序员编程艺术第三十六~三十七章、搜索智能提示suggestion,附近点搜索

    第三十六~三十七章.搜索智能提示suggestion,附近地点搜索 作者:July.致谢:caopengcs.胡果果.时间:二零一三年九月七日. 题记 写博的近三年,整理了太多太多的笔试面试题,如微软 ...

  4. 《Linux命令行与shell脚本编程大全》 第二十七章 学习笔记

    第二十七章:shell脚本编程进阶 监测系统统计数据 系统快照报告 1.运行时间 uptime命令会提供以下基本信息: 当前时间 系统运行的天数,小时数,分钟数 当前登录到系统的用户数 1分钟,5分钟 ...

  5. [汇编学习笔记][第十七章使用BIOS进行键盘输入和磁盘读写

    第十七章 使用BIOS进行键盘输入和磁盘读写 17.1 int 9 中断例程对键盘输入的处理 17.2 int 16 读取键盘缓存区 mov ah,0 int 16h 结果:(ah)=扫描码,(al) ...

  6. 第十七章——配置SQLServer(3)——配置“对即时负载的优化”

    原文:第十七章--配置SQLServer(3)--配置"对即时负载的优化" 前言: 在第一次执行查询或者存储过程时,会创建执行计划并存储在SQLServer的过程缓存内存中.在很多 ...

  7. 第十七章——配置SQLServer(4)——优化SQLServer实例的配置

    原文:第十七章--配置SQLServer(4)--优化SQLServer实例的配置 前言: Sp_configure 可以用于管理和优化SQLServer资源,而且绝大部分配置都可以使用SQLServ ...

  8. 第十七章——配置SQLServer(2)——32位和64位系统中的内存配置

    原文:第十七章--配置SQLServer(2)--32位和64位系统中的内存配置 前言: 本文讲述32位和64位系统中的内存配置,在SQLServer 2005/2008中,DBA们往往尝试开启AWE ...

  9. 第十七章——配置SQLServer(1)——为SQLServer配置更多的处理器

    原文:第十七章--配置SQLServer(1)--为SQLServer配置更多的处理器 前言: SQLServer提供了一个系统存储过程,SP_Configure,可以帮助你管理实例级别的配置.微软建 ...

  10. CSS3秘笈复习:十三章&十四章&十五章&十六章&十七章

    第十三章 1.在使用浮动时,源代码的顺序非常重要.浮动元素的HTML必须处在要包围它的元素的HTML之前. 2.清楚浮动: (1).在外围div的底部添加一个清除元素:clear属性可以防止元素包围浮 ...

随机推荐

  1. PHP 微信分享

    share.php <?php //公众号设置一下 JS接口安全域名,不要http,www的一级域名,比如http://www.baidu.com域名下的某个路径要分享,js安全域名中只需填上 ...

  2. Http状态码(转)

    什么是Http状态码?(转自http://bbs.tui18.com/thread-11597640-1-1.html) 百度百科上解释为:HTTP状态码(HTTP Status Code)是用以表示 ...

  3. GreenDao介绍

    GreenDao介绍 greenDAO 是一个将对象映射到 SQLite 数据库中的轻量且快速的 ORM 解决方案 何为ORM? ORM(Object/Relation Mapping): 对象/关系 ...

  4. list中的中文转换编码显示

    for i in range(1,sheet.nrows): row=sheet.row_values(i,0,sheet.ncols) row=str(row).replace('u\'','\'' ...

  5. libevent源码分析:eventop

    eventop:定义了event_base使用的后端IO复用的一个统一接口 /** Structure to define the backend of a given event_base. */ ...

  6. DllImport attribute的总结

    C#有没有方法可以直接都用已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法),而不需要重新编写代码? 答案是肯定,就是通过接下来要说的 DllImport . DllImp ...

  7. Jmeter从数据库获取数据当做变量,传递给其他接口

    1.添加JDBC Request 2.JDBC的配置,Variable名字和之前的数据库配置的名字一致,生成的变量放在下面的Variable name

  8. 从零开始学习Android(二)从架构开始说起

    我们刚开始学新东西的时候,往往希望能从一个实例进行入手学习.接下来的系列连载文章也主要是围绕这个实例进行.这个实例原形是从电子书<Android应用开发详解>得到的,我们在这里对其进行详细 ...

  9. GOLANG 基本数据类型 整型

    基本数据类型-整型 种类     有符号(负号)      int8 int16 int32 int64 无符号(无符号) uint8 uint16 uint32 uint64 架构特定(取决于系统位 ...

  10. 《与小卡特一起学Python》Code4 GUI easygui的使用

    EasyGui是基于TKinter的,所以可以跨平台使用. 使用方法很简单,下载之后解压把easygui.py放到python安装目录下的lib/site-packages/下面即可 import e ...