You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

91 lines
2.8 KiB

using System;
using System.Diagnostics;
using System.Timers;
namespace WebMvcEF
{
/// <summary>
/// 監控程序是否卡死
/// </summary>
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;
}
/// <summary>
/// 產生計時器去監控指定程序
/// </summary>
/// <param name="processName">程序名稱</param>
/// <param name="interval">每幾秒檢查一次</param>
private ProcessKiller(string processName, int interval)
{
// 設定時間及監控程序名
Timer = new Timer(interval * 1000);
ProcessList = Array.Empty<Process>();
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();
}
}
}