進程管理(啓動進程、獲取進程、關閉進程)

進程管理

在C#中我們可以用System.Diagnostics命名空間下的Process類來進行進程管理

  • 對本機
    • (1)可以啓動、終止某個進程
    • (2)可以查看進程相關信息,如CPU利用率等
    • (3)可以查看進程工作狀態
  • 對遠程計算機
    • (1)可以查看遠程計算機相關信息

    • (2)無法直接啓動、終止遠程計算機

  • 在一個程序中處理其他的程序(比如調用其他.exe文件、 快捷方式等),實際上就是對進程進行管理

應用場景

獲取進程信息、進程管理

如任務管理器

image-20200316132048626

啓動其他進程

  • 打開某個程序

  • 打開命令行執行命令

啓動進程

我們以打開記事本爲例

image-20200316133542827

添加一個按鈕,設置點擊事件。

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();//啓動實例
       }

啓動後

image-20200316133810521

注意:啓動的程序如果不加路徑,那麼必須在環境變量或這在程序的相同路徑下,不然就會異常。

還可以直接啓動

 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();
            }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章