天天看点

进程管理(启动进程、获取进程、关闭进程)

进程管理

在C#中我们可以用

System.Diagnostics

命名空间下的Process类来进行进程管理。

  • 对本机
    • (1)可以启动、终止某个进程
    • (2)可以查看进程相关信息,如CPU利用率等
    • (3)可以查看进程工作状态
  • 对远程计算机
    • (1)可以查看远程计算机相关信息
    • (2)无法直接启动、终止远程计算机
  • 在一个程序中处理其他的程序(比如调用其他

    .exe

    文件、 快捷方式等),实际上就是对进程进行管理。

应用场景

获取进程信息、进程管理

如任务管理器

进程管理(启动进程、获取进程、关闭进程)

启动其他进程

  • 打开某个程序
  • 打开命令行执行命令

启动进程

我们以打开记事本为例

进程管理(启动进程、获取进程、关闭进程)

添加一个按钮,设置点击事件。

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组件关联

启动进程的两种方法

  1. 实例化启动
    • 创建Process类的实例
    • StartInfo属性指定要运行的应用程序名称以及传递的参数
    • Start方法启动该进程
  2. 直接调用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

  • 静态方法
  • 根据进程 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

  • 静态方法
  • 返回一个包含所有关联进程的数组。
    • (1)获取本地计算机上指定名称的进程
      • Process[] myProcesses = Process.GetProcessesByName("进程名称");

    • (2)获取远程计算机上指定名称的进程
      • Process[] myProcesses =Process.GetProcessesByName("远程进程名称",remoteMachineName);

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();
            }