进程管理
在C#中我们可以用
System.Diagnostics
命名空间下的Process类来进行进程管理。
- 对本机
- (1)可以启动、终止某个进程
- (2)可以查看进程相关信息,如CPU利用率等
- (3)可以查看进程工作状态
- 对远程计算机
- (1)可以查看远程计算机相关信息
- (2)无法直接启动、终止远程计算机
- 在一个程序中处理其他的程序(比如调用其他
文件、 快捷方式等),实际上就是对进程进行管理。.exe
应用场景
获取进程信息、进程管理
如任务管理器
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iNyYDO0AjMzEjNxMDMwIDMy0SZnFWbp9CXn1WavwFMyAjMkVmYn1WavwVY0FWMj9CXod2LcRXZu5ic2lGblR2cq5ibkN2Lc9CX6MHc0RHaiojIsJye.png)
启动其他进程
- 打开某个程序
- 打开命令行执行命令
启动进程
我们以打开记事本为例
添加一个按钮,设置点击事件。
private void Button_Click(object sender, RoutedEventArgs e)
{
Process p = new Process(); //新建一个进程实例
p.StartInfo.FileName="notepad";//程序的名字
p.StartInfo.Arguments = "1.txt";//参数
p.StartInfo.WindowStyle = ProcessWindowStyle.Normal;//程序打开的窗口风格,最大化,最下化等
p.Start();//启动实例
}
启动后
注意:启动的程序如果不加路径,那么必须在环境变量或这在程序的相同路径下,不然就会异常。
还可以直接启动
Process.Start("notepad");
启动进程涉及的方法和属性
- StartInfo属性:获取或设置要传递给启动进程的文件名以及启动参数
- Start方法:启动进程资源并将其与Process组件关联
启动进程的两种方法
- 实例化启动
- 创建Process类的实例
- StartInfo属性指定要运行的应用程序名称以及传递的参数
- Start方法启动该进程
- 直接调用Process类提供的Start静态方法启动进程
获取进程信息
Process类的有关进程信息的属性:
- MachineName属性:关联进程正在其上运行的计算机名
- MainModule属性:获取关联进程的主模块
- Modules属性:获取由关联进程加载的模块
- TotalProcessorTime属性:获取进程的总的处理器时间
- StartTime属性:获取关联进程的启动时间
- WorkingSet64属性:为进程分配的物理内存量(字节数)
获取所有进程信息
GetProcesses
静态方法用于创建新的
Process数组
,并将该数组与本地计算机上的所有进程资源相关联。
- (1)获取本地计算机的所有进程:
-
Process[] myProcesses = Process.GetProcesses();
-
- (2)获取远程计算机的所有进程:
-
Process[] myProcesses =Process.GetProcesses (remoteMachineName);
-
static void Main(string[] args)
{
Process[] processes = Process.GetProcesses();
foreach (Process item in processes)
{
Console.WriteLine("进程名字:" + item.ProcessName);
Console.WriteLine("进程ID:" + item.Id);
try
{
Console.WriteLine("启动时间:" + item.StartTime);
}
catch(Exception ex)
{
Console.WriteLine("权限不足");
}
Console.WriteLine("线程数:" + item.Threads.Count);
Console.WriteLine("-----------------------------------");
}
Console.ReadLine();
}
获取指定进程信息
GetProcessById
GetProcessById
- 静态方法
- 根据进程 ID查找
- 返回唯一Process对象
例如
进程名字:chrome
进程ID:5080
启动时间:2020/3/15 14:05:48
线程数:15
Process process = Process.GetProcessById(5080);
Console.WriteLine("进程名字:" +process.ProcessName);
Console.WriteLine("线程数" + process.Threads.Count);
Console.WriteLine("启动时间" + process.StartTime);
GetProcessesByName
GetProcessesByName
- 静态方法
- 返回一个包含所有关联进程的数组。
- (1)获取本地计算机上指定名称的进程
-
Process[] myProcesses = Process.GetProcessesByName("进程名称");
-
- (2)获取远程计算机上指定名称的进程
-
Process[] myProcesses =Process.GetProcessesByName("远程进程名称",remoteMachineName);
-
- (1)获取本地计算机上指定名称的进程
Process[] processes = Process.GetProcessesByName("notepad");
foreach (var process in processes)
{
Console.WriteLine("进程名字:" + process.ProcessName);
Console.WriteLine("进程ID:" + process.Id);
Console.WriteLine("线程数" + process.Threads.Count);
Console.WriteLine("启动时间" + process.StartTime);
}
停止进程
停止进程的两种方法
-
: 有图形界面CloseMainWindow + Close(释放资源)
-
: 所有程序Kill + WaitForExit(等待退出)
若进程正要终止的同时调用Kill方法,可能会引发异常,所以调用时最好使用try/catch语句。
Process类提供的相关方法和属性
Kill方法和CloseMainWindow方法
- 前者用于强行终止进程,后者只是“请求”终止进程。
HasExited属性
- HasExited属性用于判断启动的进程是否已停止运行。
WaitForInputIdle方法
- 仅适用于具有用户界面的进程,它可以使Process等待关联进程进入空闲状态。
WaitForExit方法
- 设置等待关联进程退出的时间
Process[] processes = Process.GetProcessesByName("notepad");
foreach (var item in processes)
{
item.Kill();
item.WaitForExit();
}