【发布时间】:2010-03-10 04:56:22
【问题描述】:
我有一个需要连续运行的简单 .exe。
不幸的是,有时它会意外崩溃,对此无能为力。
我在想一个 C# 程序,它在计时器上扫描正在运行的应用程序树,如果进程停止运行,它会重新启动它...?不过不知道该怎么做....
还有其他想法吗?
【问题讨论】:
-
“有时它会意外崩溃,对此无能为力。”这就是软件很烂的原因。
我有一个需要连续运行的简单 .exe。
不幸的是,有时它会意外崩溃,对此无能为力。
我在想一个 C# 程序,它在计时器上扫描正在运行的应用程序树,如果进程停止运行,它会重新启动它...?不过不知道该怎么做....
还有其他想法吗?
【问题讨论】:
这样做相当容易,但“意外崩溃,对此无能为力”对我来说听起来很可疑。也许您的意思是有问题的程序来自第三方,您需要解决他们无法/不会解决的问题?
无论如何,有很多sample code 可以完全按照您的要求行事。
【讨论】:
第一个解决方案是修复您的 EXE,使其不会崩溃。如果现在不能修复,可能需要添加异常处理,这样才能捕获异常,而不是关闭EXE。
第二种解决方案是编写简单的保护程序,它将启动您的简单 .exe 并监控特定的进程句柄。它会在关闭时重新启动您的程序。
【讨论】:
最简单的方法是让您编写程序查看其自身的实例是否正在运行,如果是则退出。设置计划任务以每隔几分钟运行一次。
class Program
{
static void Main(string[] args)
{
if (IsRunning())
{
return;
}
else
{
for (int x = 0; x < 10; x++)
{
//Do Stuff
System.Threading.Thread.Sleep(1000);
}
}
}
private static bool IsRunning()
{
Process[] P = Process.GetProcessesByName( Process.GetCurrentProcess().ProcessName ) ;
return P.Count() > 1;
}
}
【讨论】:
过去几天恶意软件偶尔使用的一个技巧是让两个进程分别监控当前正在运行的进程,并在另一个进程终止时重新启动。
System.Diagnostics 命名空间有可以提供帮助的类,尤其是“Process”。
例如
static Process[] Process.GetProcesses()
返回所有当前正在运行的进程的列表。
如果您的其他进程不在此列表中,则只需重新启动它,例如
Process.Start()
【讨论】:
您的程序最初需要自己启动目标进程(使用Process.Start),然后只需等待它终止(使用 Process.Start() 返回的对象上的WaitForExit)。之后重复整个过程。
这样您就可以确定您正在观看您感兴趣的进程,并且您根本不需要轮询进程列表。
Process.Start() 和 WaitForExit() 用法example。
【讨论】: