我使用VS 2005(c#)创建了一个winform(监控)应用程序,现在,当这个应用程序因某些原因崩溃时我遇到了问题,我必须确保它会自动重启。
我该如何解决这个问题? (也许通过使用Windows服务应用程序?)
由于
答案 0 :(得分:9)
是的,创建一个Windows Service会起作用,因为你可以将其设置为在崩溃时自动重启,但更好的方法是防止它首先崩溃!是否有特定原因导致崩溃?
通过良好的错误处理和报告,您可以编写它,以便它只报告发生并继续发生的任何错误,恕我直言,这将是最佳途径
答案 1 :(得分:6)
考虑一下:
http://msdn.microsoft.com/en-us/library/cc303699.aspx
[DllImport("kernel32.dll")]
public static extern int RegisterApplicationRestart(
[MarshalAs(UnmanagedType.BStr)] string commandLineArgs,
int flags);
支持的最低服务器
Windows Server 2008
http://msdn.microsoft.com/en-us/library/aa373347(VS.85).aspx
答案 2 :(得分:3)
对于任何长时间运行的后台进程,创建Windows服务是一个非常好的主意,原因很多,然而重新启动崩溃的应用程序不是其中之一!
您应该弄清楚应用程序崩溃的原因并防止它发生。
无论如何,还要将您的应用程序转换为Windows服务 - 您将看到许多好处,但解决问题的正确方法是首先修复应用程序崩溃。
答案 3 :(得分:1)
对于* 强文 *一个观察者应用。 您应该在Windows服务上创建一个计时器,并在计时器tick事件中编写类似的代码:
Process[] procs = Process.GetProcessesByName("you app name");
if (procs.Length == 0)
Process.Start("your app filename");
如果你真的无法对崩溃问题采取任何措施,我会推荐一个try-catch而不是一个观察者。 (别忘了重新抛出处理过的主要例外情况)
[STAThread]
static void Main()
{
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
catch(Exception ex)
{
//log the exception here
Application.Restart();
}
}
答案 4 :(得分:0)
由于您说您使用的是Windows窗体应用程序,因此不能使用Windows服务,因为不允许Windows服务使用GUI。
我会做什么,我会创建一个不可见的“看门狗”应用程序,它监视进程并在崩溃时自动重新启动它。
答案 5 :(得分:0)
你可以在最有可能导致崩溃的代码周围放置一个try catch块。然后将异常消息写入日志文件。您还可以在catch块中设置调试点以查看其他详细信息,如调用堆栈等。
答案 6 :(得分:0)
谢谢大家,我选择的解决方案是:在主程序中,我在这些事件中添加异常事件(UnhandledExceptionEventHandler& ThreadExceptionEventHandler,见上文),我重新启动程序(同时将log& email跟踪错误)。对于重启问题,我在[HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run]中添加了我的应用程序路径中的注册表项,以确保在Windows重启后我的应用程序将重新启动;)