using System; using System.Diagnostics; using System.Timers; namespace WebMvcEF { /// /// 監控程序是否卡死 /// public sealed class ProcessKiller : IDisposable { private readonly Timer Timer; private Process[] ProcessList; private readonly string ProcessName; public static ProcessKiller StartNew(string processName, int interval) { var process = new ProcessKiller(processName, interval); process.Start(); return process; } /// /// 產生計時器去監控指定程序 /// /// 程序名稱 /// 每幾秒檢查一次 private ProcessKiller(string processName, int interval) { // 設定時間及監控程序名 Timer = new Timer(interval * 1000); ProcessList = Array.Empty(); ProcessName = processName; // 計時檢查程序卡死問題 Timer.Elapsed += new ElapsedEventHandler(CheckProcess); Timer.AutoReset = true; } private void CheckProcess(object sender, ElapsedEventArgs e) { // 判斷是不是為空 if (ProcessList.Length >= 1) { // 把當下電腦執行soffice取回來 var currentProcesses = Process.GetProcessesByName(ProcessName); if (currentProcesses.Length > 0) { try { // 把上次抓的List跟當下抓的List做比對 for (var i = 0; i < ProcessList.Length; i++) { for (var j = 0; j < currentProcesses.Length; j++) { // 如果有相同id的就刪除 if (ProcessList[i].Id == currentProcesses[j].Id) { ProcessList[i].Kill(); break; } } } } catch (Exception) { // 關不掉也沒關係 } } } // 重抓一次程序,下一次可以比對 ProcessList = Process.GetProcessesByName(ProcessName); } public void Start() { Timer.Start(); } public void Stop() { Timer.Stop(); } public void Dispose() { Timer?.Dispose(); } } }