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();
}
}
}