Постоянно работающий исполняемый файл
Я создал приложение 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 не разрешено иметь графический интерфейс.
Что бы я сделал, я бы создал невидимое приложение "сторожевой таймер", которое следит за процессом и автоматически перезапускает его в случае сбоя.