• 《精通C#》第十七章


    进程简单的说就是一个正在运行的程序,包含了运行该程序所需要的一切资源以及内存分配。线程是进程的基本执行单元,在进程的入口点(类似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

  • 相关阅读:
    多态
    封装
    继承
    面向对象
    2.机器学习相关数学基础
    作业1 机器学习概述
    作业15 语法制导的语义翻译
    作业14 算符优先分析
    作业13 自下而上语法分析
    作业12 实验二 递归下降语法分析
  • 原文地址:https://www.cnblogs.com/Lin-Li/p/6074421.html
Copyright © 2020-2023  润新知