2010-10-04 6 views
-1

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

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

Благодаря

ответ

0

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

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

+1

Просто не забывайте что для этого требуется, по крайней мере, Vista/Windows Server 2008. –

+0

У меня есть XP сейчас, но если есть проблема с внешним видом (сбой в Windows), как мое приложение может перезагрузиться (после перезагрузки Windows)? – bidak

+0

Для более старых версий окон у вас может быть свой собственный seconary exe для мониторинга основного приложения. – zproxy

9

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

С хорошей обработки ошибок и отчетности вы можете написать его так, чтобы он просто сообщает об ошибках, которые происходят и продолжается, что ИМХО будет лучший маршрут идти

+4

+1: Для совета сначала попытаться выяснить, почему ** он падает! – Hemant

+0

, когда я говорю об авариях, возможно, необработанное исключение !! или авария окон и перезагрузка, я должен быть уверен, что мое приложение всегда работает – bidak

+0

@bidak: используйте Try/Catches для обработки необработанных исключений и для запуска вашего приложения после перезагрузки поставьте ярлык на него в папке «Автозагрузка» вашего меню «Пуск» – w69rdy

3

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

Вы должны решить причину сбоя приложения и предотвратить его.

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

+0

как конвертировать мое приложение в службу Windows? – bidak

+0

@bidak - сообщение w69rdy имеет отличную ссылку. – Justin

0

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

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

0

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

+0

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

1

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

 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(); 
     } 
    } 
+0

Я добавил это в свое приложение: Application.ThreadException + = новый ThreadExceptionEventHandler (Application_ThreadException); AppDomain.CurrentDomain.UnhandledException + = новый UnhandledExceptionEventHandler (CurrentDomain_UnhandledException); В этой функции я перезапускаю приложение, но если это проблема с окнами (утечка памяти, ...), я не могу обнаружить это в своем приложении, которое было запущено системой Windows. Спасибо, я увижу пример использования Windows. – bidak

+0

Вы можете использовать муравьев для обнаружения утечки памяти: http://www.red-gate.com/products/ants_memory_profiler/index.htm?utm_source=simpletalk&utm_medium=article&utm_content=mikebloise&utm_campaign=antsmemoryprofiler –

Смежные вопросы