錯誤代碼
string processName = "explorer";
Process[] procs = Process.GetProcessesByName(processName);
procs[0].Kill(); // 若 procs.Length == 0 直接拋 IndexOutOfRangeException
正確寫法
string processName = "explorer";
Process[] procs = Process.GetProcessesByName(processName);
if (procs.Length > 0) {
foreach (var p in procs) {
try { p.Kill(); } catch (Exception ex) { /* 記錄日誌 */ }
}
} else {
Console.WriteLine($"進程 {processName} 未運行");
}
進階封裝:通用輔助方法
public static bool TryKillProcess(string name, int timeoutMs = 2000) {
var procs = Process.GetProcessesByName(name);
if (procs.Length == 0) return true; // 已不存在視為成功
foreach (var p in procs) {
p.Kill();
if (!p.WaitForExit(timeoutMs)) {
// 強制結束失敗,記錄錯誤
return false;
}
}
return true;
}
注意事項
- 關鍵系統進程(explorer、csrss 等)Kill 後會自動重啟,但可能導致桌面閃爍、托盤圖標丟失,謹慎使用。
- 需管理員權限才能 Kill 系統級進程,請在 manifest 加入
<requestedExecutionLevel level="requireAdministrator" />。
- 生產環境優先考慮
Process.CloseMainWindow() 優雅關閉 GUI 程式。