首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 列舉處理序與詳細資訊:Process.GetProcesses 完整應用範例

     編輯:關於C語言

前言

系統管理工具常需列舉執行中處理序並顯示詳細資訊。本文提供完整 WinForms 範例:ListBox 顯示處理序名稱、選取後在 Label 群組顯示詳細屬性。

核心 API:Process 類別


using System.Diagnostics;

// 取得所有處理序
Process[] processes = Process.GetProcesses();

// 依名稱取得處理序陣列
Process[] notepads = Process.GetProcessesByName("notepad");

完整 WinForms 實作範例

表單設計

  • listBox1:顯示處理序名稱清單
  • groupBox1:標題顯示選中處理序名稱
  • label1~label14:顯示各項詳細屬性

載入處理序清單


private void LoadProcessList()
{
    listBox1.Items.Clear();
    Process[] processes = Process.GetProcesses();
    
    foreach (Process p in processes)
    {
        listBox1.Items.Add(p.ProcessName);
    }
    
    if (listBox1.Items.Count > 0)
        listBox1.SelectedIndex = 0;
}

顯示詳細資訊 (SelectedIndexChanged 事件)


private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    try
    {
        string processName = listBox1.Text;
        groupBox1.Text = $"{processName} 處理序詳細資訊";
        
        Process[] processes = Process.GetProcessesByName(processName);
        if (processes.Length == 0) return;
        
        Process p = processes[0];  // 取第一個同名處理序
        
        label1.Text  = $"處理序映像名:{p.ProcessName}";
        label2.Text  = $"處理序 ID:{p.Id}";
        label3.Text  = $"執行緒數:{p.Threads.Count}";
        label4.Text  = $"CPU 時間:{p.TotalProcessorTime}";
        label5.Text  = $"優先序類別:{p.PriorityClass}";
        label6.Text  = $"啟動時間:{p.StartTime:yyyy/MM/dd HH:mm:ss}";
        
        // 記憶體相關 (單位轉換為 KB)
        label7.Text  = $"專用記憶體:{p.PrivateMemorySize64 / 1024:N0} KB";
        label8.Text  = $"峰值虛擬記憶體:{p.PeakVirtualMemorySize64 / 1024:N0} KB";
        label9.Text  = $"峰值分頁記憶體:{p.PeakPagedMemorySize64 / 1024:N0} KB";
        label10.Text = $"分頁系統記憶體:{p.PagedSystemMemorySize64 / 1024:N0} KB";
        label11.Text = $"分頁記憶體:{p.PagedMemorySize64 / 1024:N0} KB";
        label12.Text = $"非分頁系統記憶體:{p.NonpagedSystemMemorySize64 / 1024:N0} KB";
        label13.Text = $"工作集 (物理記憶體):{p.WorkingSet64 / 1024:N0} KB";
        label14.Text = $"虛擬記憶體:{p.VirtualMemorySize64 / 1024:N0} KB";
    }
    catch (Exception ex)
    {
        MessageBox.Show($"無法取得處理序資訊:{ex.Message}", "錯誤", 
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

Process 關鍵屬性對照表

屬性說明單位/型別
ProcessName處理序名稱 (不含 .exe)string
Id處理序識別碼 (PID)int
Threads執行緒集合ProcessThreadCollection
TotalProcessorTime總 CPU 使用時間TimeSpan
PriorityClass優先序類別ProcessPriorityClass
StartTime啟動時間DateTime
PrivateMemorySize64專用記憶體 (不可共享)long (bytes)
VirtualMemorySize64虛擬記憶體大小long (bytes)
WorkingSet64物理記憶體工作集long (bytes)
PagedMemorySize64分頁記憶體long (bytes)
NonpagedSystemMemorySize64非分頁系統記憶體long (bytes)
PeakVirtualMemorySize64峰值虛擬記憶體long (bytes)
PeakPagedMemorySize64峰值分頁記憶體long (bytes)
PagedSystemMemorySize64分頁系統記憶體long (bytes)

注意事項與最佳實踐

  • 權限問題:存取系統處理序 (如 System, csrss) 部分屬性需管理員權限,建議 try-catch 處理
  • 64 位元屬性:優先使用 Xxx64 版本屬性 (PrivateMemorySize64),避免 32 位元溢位
  • 同名處理序:GetProcessesByName 回傳陣列,Chrome 等多處理序架構會有多個項目
  • 效能考量:GetProcesses() 會建立快照,頻繁呼叫有開銷,建議快取或計時器週期性更新
  • 單位轉換:記憶體屬性單位為 bytes,顯示建議轉 KB/MB/GB 並加千分位格式 :N0

進階:監控特定處理序變化


private async Task MonitorProcessAsync(string processName, TimeSpan interval)
{
    while (true)
    {
        var processes = Process.GetProcessesByName(processName);
        if (processes.Length > 0)
        {
            var p = processes[0];
            Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {processName} " +
                $"CPU: {p.TotalProcessorTime} | RAM: {p.WorkingSet64 / 1024 / 1024} MB");
        }
        else
        {
            Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] {processName} 未執行");
        }
        await Task.Delay(interval);
    }
}

總結

Process.GetProcesses 系列 API 提供完整的處理序列舉與檢查能力。配合 WinForms/UI 顯示,可快速建構工作管理員類工具。關鍵在於正確處理權限例外、使用 64 位元記憶體屬性、單位轉換與格式化顯示。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved