永久运行可执行文件

时间:2010-10-04 10:15:53

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

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

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

由于

7 个答案:

答案 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重启后我的应用程序将重新启动;)