0

我使用 VS 2005 (c#) 创建了一个 winform (monitoring) 应用程序,现在,当这个应用程序由于某种原因崩溃时我遇到了问题,我必须确保它会自动重新启动。

我该如何解决这个问题?(也许通过使用 Windows 服务应用程序?)

谢谢

4

7 回答 7

9

是的,创建Windows 服务会起作用,因为您可以将其设置为在崩溃时自动重启,但更好的方法是首先防止它崩溃!它崩溃是否有特定原因?

通过良好的错误处理和报告,您可以编写它,以便它只报告发生的任何错误并继续执行,恕我直言,这将是最好的选择

于 2010-10-04T10:20:52.517 回答
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);

支持的最低服务器

视窗服务器 2008

http://msdn.microsoft.com/en-us/library/aa373347(VS.85).aspx

于 2010-10-04T10:19:50.487 回答
3

出于多种原因,创建 Windows 服务对于任何长时间运行的后台进程都是一个非常好的主意,但是重新启动崩溃的应用程序不是其中之一!

您应该找出应用程序崩溃的原因并防止它发生。

无论如何,也将您的应用程序转换为 Windows 服务 - 您会看到很多好处,但是解决问题的正确方法是首先修复应用程序崩溃。

于 2010-10-04T10:41:52.760 回答
1

对于*强文本* 一个观察者应用程序。您应该在 Windows 服务上创建一个计时器,并在计时器滴答事件中编写如下代码:

        Process[] procs = Process.GetProcessesByName("you app name");
        if (procs.Length == 0)
            Process.Start("your app filename");

如果你真的对崩溃问题无能为力,我会推荐一个 try-catch 而不是 watcher。(不要忘记重新抛出处理过的重大异常)

    [STAThread]
    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
        catch(Exception ex)
        {
            //log the exception here
            Application.Restart();
        }
    }
于 2010-10-04T12:26:48.990 回答
0

由于您说您使用的是 Windows 窗体应用程序,因此您不能为此使用 Windows 服务,因为不允许 Windows 服务具有 GUI。

我会做什么,我会创建一个不可见的“看门狗”应用程序来监视进程并在它崩溃时自动重新启动它。

于 2010-10-04T10:42:15.743 回答
0

谢谢大家,我选择的解决方案是:在主程序中我添加一个异常事件(UnhandledExceptionEventHandler 和 ThreadExceptionEventHandler 见上文)在这些事件中我重新启动程序(也将日志和电子邮件放入跟踪错误)。对于重启问题,我在 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] 中添加注册表项和我的应用程序路径,以确保我的应用程序将在 Windows 重启后重新启动;)

于 2010-10-06T09:06:19.127 回答
0

您可以在最有可能导致崩溃的代码周围放置一个 try catch 块。然后将异常消息写入日志文件。您还可以在 catch 块中设置调试点,以查看调用堆栈等其他详细信息。

于 2010-10-04T11:22:00.963 回答