当前位置:首页 > C#编程 > C#/.net框架 > 正文内容

细说进程、应用程序域与上下文之间的关系(一)——进程的概念与作用

Jorge2年前 (2022-05-08)C#/.net框架732

引言

本文主要是介绍进程(Process)、应用程序域(AppDomain)、.NET上下文(Context)的概念与操作。
虽然在一般的开发当中这三者并不常用,但熟悉三者的关系,深入了解其作用,对提高系统的性能有莫大的帮助。
在本篇最后的一节当中将会介绍到三者与线程之间的关系,希望对多线程开发人员能提供一定的帮助。
因为时间仓促,文中有错误的地方敬请点评。

目录

一、进程的概念与作用

二、应用程序域

三、深入了解.NET上下文

四、进程应用程序域与线程的关系

 

一、进程的概念与作用

进程(Process)是Windows系统中的一个基本概念,它包含着一个运行程序所需要的资源。进程之间是相对独立的,一个进程无法直接访问另 一个进程的数据(除非利用分布式计算方式),一个进程运行的失败也不会影响其他进程的运行,Windows系统就是利用进程把工作划分为多个独立的区域 的。进程可以理解为一个程序的基本边界。

 

1.1 Process 的属性与方法

在 System.Diagnostics 命名空间当中存在Process类,专门用于管理进程的开始、结束,访问进程中的模块,获取进程中的线程,设定进程的优先级别等。
表1.0 显示了Process类的常用属性:
 

属性说明
BasePriority获取关联进程的基本优先级。
ExitCode获取关联进程终止时指定的值。
ExitTime获取关联进程退出的时间。
Handle返回关联进程的本机句柄。
HandleCount获取由进程打开的句柄数。
HasExited获取指示关联进程是否已终止的值。
Id获取关联进程的唯一标识符。
MachineName获取关联进程正在其上运行的计算机的名称。
MainModule获取关联进程的主模块。
Modules获取已由关联进程加载的模块。
PriorityClass获取或设置关联进程的总体优先级类别。
ProcessName获取该进程的名称。
StartInfo获取或设置要传递给Process的Start方法的属性。
StartTime获取关联进程启动的时间。
SynchronizingObject获取或设置用于封送由于进程退出事件而发出的事件处理程序调用的对象。
Threads获取在关联进程中运行的一组线程

 表1.0

除了上述属性,Process类也定义了下列经常使用的方法:
 

方法说明
GetProcessById创建新的 Process 组件,并将其与您指定的现有进程资源关联。
GetProcessByName创建多个新的 Process 组件,并将其与您指定的现有进程资源关联。
GetCurrentProcess获取新的 Process 组件并将其与当前活动的进程关联。
GetProcesses获取本地计算机上正在运行的每一个进程列表。
Start启动一个进程。
Kill立即停止关联的进程。
Close释放与此组件关联的所有资源。
WaitForExit指示 Process 组件无限期地等待关联进程退出。

 表1.1

Process类的详细信息可以参考 http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.aspx
下面将举例介绍一下Process的使用方式

 

1.2 建立与销毁进程

利用 Start 与Kill 方法可以简单建立或者销毁进程,下面例子就是利用 Start 方法启动记事本的进程,并打开File.txt文件。2秒钟以后,再使用 Kill 方法销毁进程,并关闭记事本。

C#
  static void Main(string[] args)
         {
             Process process = Process.Start("notepad.exe","File.txt");
             Thread.Sleep(2000);
             process.Kill();
         }

image.png


1.3 列举计算机运行中的进程

在表1.0 中可以看到,使用 GetProcesses 方法可以获取本地计算机上正在运行的每一个进程列表。
而进程的 Id 属性是每个进程的唯一标志,通过下面的方法,可以显示当前计算机运行的所有进程信息。
因为篇幅关系,下面例子只获取前10个进程。

C#
         static void Main(string[] args)
         {
             var processList = Process.GetProcesses()
                 .OrderBy(x=>x.Id)
                 .Take(10);
             foreach (var process in processList)
                 Console.WriteLine(string.Format("ProcessId is:{0} \t ProcessName is:{1}",
                     process.Id, process.ProcessName));
             Console.ReadKey();
         }

运行结果

image.png

如果已知进程的Id,就可以通过 GetProcessById 方法获取对应的进程。

C#
         static void Main(string[] args)
         {             try
             {                 var process = Process.GetProcessById(1772);
                 Console.WriteLine("Process name is:" + process.ProcessName);
             }             catch (ArgumentException ex)
             {
                 Console.WriteLine("Process is nothing!");
             }
             Console.ReadKey();
         }

同样地,你也可能通过GetProcessByName方法获取多个对应名称的进程。

注意:如果不能找到当前ID的进程,系统就会抛出ArgumentException异常。所以使用方法 GetProcessById 获取进程时应该包含在 try{...} catch{..} 之内。

 

1.4 获取进程中的多个模块

在表1.0 中包含了Process类的Modules属性,通过此属性可能获取进程中的多个模块。
这些模块可以是以 *.dll 结尾的程序集,也可以是 *.exe 结尾的可执行程序。
下面的例子就是通过 Process 的 GetCurrentProcess 方法获取当前运行的进程信息,然后显示当前进程的多个模块信息。

C#
         static void Main(string[] args)
         {
             var moduleList = Process.GetCurrentProcess().Modules;
             foreach (System.Diagnostics.ProcessModule module in moduleList)
                 Console.WriteLine(string.Format("{0}\n  URL:{1}\n  Version:{2}",
                     module.ModuleName,module.FileName,module.FileVersionInfo.FileVersion));
             Console.ReadKey();
         }


结果较长,勇哥只截取了一部分,如下:

image.png

#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。


扫描二维码推送至手机访问。

版权声明:本文由7点博客发布,如需转载请注明出处。

本文链接:http://6dot.cn/?id=60

标签: .NET.NET框架
分享给朋友:

“细说进程、应用程序域与上下文之间的关系(一)——进程的概念与作用” 的相关文章

C# 控件闪烁问题的解决

C# 控件闪烁问题的解决

说一下解决C#下控件闪烁的几个问题,如下:  listview和datagridview显示数据闪烁 自定义控件的显示闪烁listbox滚动条拖动闪烁面板中控件过多的闪烁propertyGrid点击和修改项目缓慢的问题richtextbox控件的刷新显示问题此类问题对于界面复杂规...

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

C# 当List.Find()返回一个结构体对象时,如何判断它为空?

请看演示程序。我们知道List.Find() 如果找到则返回这个对象,找不到返回这个类型的缺省值。下面例子中,你无法这样写:            if(res1==null)        &nbs...

C#中使用RegisterWindowMessage进行进程之间进行通讯

C#中使用RegisterWindowMessage进行进程之间进行通讯

注:大家都知道在window里,进程之间通讯可以用消息通讯。但是有个较冷门的知识就是RegisterWindowMessage。一般的sendmessage和postmessage是需要在窗体程序间进行通讯,你得知道对方窗口的句柄。这个句柄每次启动程序时是系统分配的,每次不一样。有了这个Regist...

谈谈ObservableCollection观察者集合

谈谈ObservableCollection观察者集合

注:事件很常见,但有重复的代码量。如果你想简化一下事件的编程,而且是整个程序只使用一个像事件池一样的东西,可以尝试使用下文讲的ObservableCollection观察者集合来做到。ObservableCollection<T>类表示一个动态数据集合,在添加项,移除项或刷新整个列表时,...

计算代码执行时间,可以精确到十亿分之一秒

计算代码执行时间,可以精确到十亿分之一秒

注:.Net的Stopwatch类可以精确到1/10000毫秒, 有没有更精确的计时吗?见下面的代码。暂时没试过效果,大家可以试下。计算某个代码片段的执行时间,精确到CPU执行一条指令所用的时间(十亿分之一秒),可用于精确计算某个算法的执行时间。 代码:C#using Syste...

关于C#项目引用的一点经验

关于C#项目引用的一点经验

关于项目引用,有几种:(一)这种是引用系统的程序集(二)下面这种是引用你自己的项目“解决方案”(三)最后一种是浏览本机上的项目的dll。对于工程中有几十个项目的软件来说,虽然使用(二)是很方便。但是会编译速度奇慢,而且随着项目越多越慢。貌似他run之前都会把所有项目都试图更新一下。勇哥宿舍的电脑,实...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。