【问题标题】:Permanently running executable永久运行的可执行文件
【发布时间】:2010-10-04 10:15:53
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: c# winforms windows-services permanent-generation


    【解决方案1】:

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

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

    【讨论】:

    • +1:关于首先尝试找出为什么它崩溃的建议!
    • 当我说崩溃时,可能是未处理的异常!或 Windows 崩溃并重新启动,我必须确保我的应用程序始终在运行
    • @bidak:使用 Try/Catches 来处理未处理的异常,并在重新启动后启动您的应用,在“开始”菜单的“启动”文件夹中放置一个快捷方式
    【解决方案2】:

    考虑一下:

    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 服务器 2008

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

    【讨论】:

    • 别忘了这至少需要 Vista/Windows Server 2008。
    • 我现在有 win XP,但是如果出现外部问题(Windows 崩溃)我的应用程序如何重新启动(Windows 重新启动后)?
    • 对于旧版本的 Windows,您可以使用自己的辅助 exe 监控主应用程序。
    【解决方案3】:

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

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

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

    【讨论】:

    • 如何将我的应用程序转换为 Windows 服务?
    【解决方案4】:

    对于*强文本* 一个观察者应用。 您应该在 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();
            }
        }
    

    【讨论】:

    • 我将此添加到我的应用程序中:Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);在这些功能中,我重新启动了我的应用程序,但如果它是 Windows 问题(内存泄漏,...),我无法在我的应用程序中检测到由 Windows 系统触发的问题。谢谢,我会看到 Windows 服务示例。
    • 可以使用蚂蚁检测内存泄漏:red-gate.com/products/ants_memory_profiler/…
    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

        • 谢谢大家,我选择的解决方案是:在主程序中,我在这些事件中添加一个异常事件(UnhandledExceptionEventHandler 和 ThreadExceptionEventHandler 见上文)我重新启动程序(也将日志和电子邮件用于跟踪错误)。对于重启问题,我在 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] 中添加注册表项和我的应用程序路径,以确保我的应用程序将在 Windows 重启后重新启动;)
        猜你喜欢
        • 1970-01-01
        • 2022-11-18
        • 1970-01-01
        • 2011-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多