Постоянно работающий исполняемый файл

Я создал приложение winform (мониторинг) с использованием VS 2005 (C#), и теперь у меня есть проблема, когда это приложение по какой-то причине дает сбой, я должен быть уверен, что оно будет перезапущено автоматически.

Как я могу решить это? (может быть, с помощью приложения служб Windows?)

Спасибо

7 ответов

Решение

Спасибо вам всем, решение, которое я выбрал: в основной программе я добавляю события исключений (UnhandledExceptionEventHandler & ThreadExceptionEventHandler см. Выше), в этих событиях я перезапускаю программу (также помещая журнал и электронную почту для отслеживания ошибок). И для проблемы перезагрузки я добавляю раздел реестра в [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run] с моим путем к приложению, чтобы быть уверенным, что мое приложение будет перезапущено после перезагрузки Windows;)

Да, создание службы Windows будет работать, поскольку вы можете настроить ее автоматический перезапуск в случае сбоя, но лучшим способом было бы предотвратить его падение в первую очередь! Есть ли конкретная причина сбоя?

С хорошей обработкой ошибок и составлением отчетов вы можете написать их так, чтобы они просто сообщали о любых ошибках, которые происходят и продолжаются, что, IMHO, будет лучшим путем

Учти это:

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

Создание службы Windows - очень хорошая идея для любого продолжительного фонового процесса по многим причинам, однако перезапуск аварийного приложения не является одним из них!

Вы должны разобраться, почему происходит сбой приложения, и не допустить его возникновения.

Во что бы то ни стало, также конвертируйте ваше приложение в службу Windows - вы увидите много преимуществ, однако правильный способ решения вашей проблемы - это прежде всего исправить ошибку приложения.

Для *сильного текста* приложение-наблюдатель. Вы должны создать таймер в службе Windows и кодировать что-то вроде этого в событии отметки времени:

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

если вы действительно не можете ничего сделать с проблемой сбоя, я бы порекомендовал попробовать-поймать вместо наблюдателя. (Не забудьте перебросить обработанные основные исключения)

    [STAThread]
    static void Main()
    {
        try
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
        }
        catch(Exception ex)
        {
            //log the exception here
            Application.Restart();
        }
    }

Вы можете поместить блок try catch вокруг кода, который наиболее вероятно вызывает сбой. Затем запишите сообщение об исключении в файл журнала. Вы также можете установить точку отладки в блоке catch, чтобы увидеть другие детали, такие как стек вызовов и т. Д.

Поскольку вы говорите, что используете приложение Windows Forms, вы не можете использовать для этого службу Windows, поскольку службе Windows не разрешено иметь графический интерфейс.

Что бы я сделал, я бы создал невидимое приложение "сторожевой таймер", которое следит за процессом и автоматически перезапускает его в случае сбоя.

Другие вопросы по тегам