進程管理
在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組件關聯
啓動進程的兩種方法
- 實例化啓動
- 創建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
- 靜態方法
- 根據進程 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);
- (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();
}