需求
根据运行环境要求,我们所做的程序常常会在无人监管的情况下运行几个月之久。所以为了保证程序的正常运行,决定添加一个附属的监控程序。监控程序要求如下:
- 当检测到主程序未启动时,启动主程序。
- 当检测到主程序进程无响应,且超过一定时间后,重启主程序。
- 主程序启动时,会检测监控程序状态,若监控程序未启动,则启动监控程序。
4基于以上要求,
设计思路
基于以上要求,我编写了基于.NET的监管程序。
- 首先,创建Windows窗体应用程序,在其Load事件中,写入
this.Hide();//隐藏窗体
this.ShowInTaskBar = false;//使监控程序不在任务栏出现
- 使用定时器,
- tmr = new System.Threading.Timer(new TimerCallback(Call), null, 0, 5000);
实现
以下是完整代码
public class MonitorAndRestart
{
//string path = AppDomain.CurrentDomain.BaseDirectory+ "QQ.exe";
//要启动程序的路径,以qq为例,可将其设置为
string path = "D:\\Program Files\\QQ\\Bin\\" + "QQ.exe";
string progressName = "QQ";
static System.Threading.Timer tmr = null;
public void CallTick()
{
// 一个 System.Threading.TimerCallback 委托,表示要执行的方法
//一个包含回调方法中,要使用信息的对象或 null
// 在之前的延迟时间量 callback 调用,以毫秒为单位
// 调用之间的时间间隔 callback
tmr = new System.Threading.Timer(new TimerCallback(Call), null, 0, 5000);
}
private void Call(Object sender)//监听程序
{
try
{
if (System.Diagnostics.Process.GetProcessesByName(progressName).ToList().Count == 0)
{
System.Diagnostics.Process.Start(path);
}
else if (System.Diagnostics.Process.GetProcessesByName(progressName)[0].Responding == false)
{
System.Diagnostics.Process.GetProcessesByName(progressName)[0].Kill();
Thread.Sleep(200);
System.Diagnostics.Process.Start(path);
}
}
catch (Exception ex)
{
}
}
}
在Load事件中,实例化MonitorAndRestart类,调用CallBack方法即可。
MonitorAndRestart ms = new MonitorAndRestart();
ms.CallTick();
在主程序中可是用同样方法,在主程序启动时,将监控程序启动。