Executável permanentemente executável
-
27-09-2019 - |
Pergunta
Criei um aplicativo Winform (Monitoramento) usando o VS 2005 (C#) e agora tenho um problema quando esse aplicativo trava por algum motivo, tenho que ter certeza de que ele será reiniciado automaticamente.
Como posso resolver isto? (Talvez usando o aplicativo Windows Services?)
Obrigado
Solução 6
Obrigado a todos, a solução que escolho é: No programa principal, adiciono eventos de exceção (UNHLEDLEEXCECCEIÇÃO EMPRESSÃO E THINECCECCIONSEVENTHANDLER Veja acima) nesses eventos, reinicio o programa (também colocando log e email para rastrear erros). E para o problema de reinicialização, adiciono a chave do registro em [hkey_local_machine software microsoft windows currentVersion run] com o caminho do meu aplicativo para garantir que meu aplicativo seja reiniciado após a reinicialização do Windows;)
Outras dicas
Sim, uma criação de um Serviço do Windows Funcionaria como você pode configurá -lo para reiniciar automaticamente se travar, mas uma maneira melhor seria impedir que ele trave em primeiro lugar! Existe uma razão específica pela qual trava?
Com um bom tratamento de erros e relatórios, você pode escrevê -lo para que ele simplesmente relate quaisquer erros que ocorram e continuem, o que o IMHO seria o melhor caminho a seguir
Considere isto:
http://msdn.microsoft.com/en-us/library/cc303699.aspx
[DllImport("kernel32.dll")]
public static extern int RegisterApplicationRestart(
[MarshalAs(UnmanagedType.BStr)] string commandLineArgs,
int flags);
Servidor mínimo suportado
Windows Server 2008
http://msdn.microsoft.com/en-us/library/aa373347(vs.85).aspx
Criar um serviço do Windows é uma ideia muito boa para qualquer processo de fundo de longa duração por muitos motivos, No entanto, reiniciar um aplicativo acidentado não é um deles!
Você deve descobrir por que o aplicativo está travando e impedir que isso aconteça.
Por todos os meios, converta também seu aplicativo em um serviço do Windows - você verá muitos benefícios, no entanto, a maneira correta de resolver seu problema é corrigir a falha do aplicativo em primeiro lugar.
Por*texto forte* um aplicativo de observador. Você deve criar um cronômetro no serviço do Windows e codificar algo assim no evento Tick Tick:
Process[] procs = Process.GetProcessesByName("you app name");
if (procs.Length == 0)
Process.Start("your app filename");
Se você realmente não pode fazer nada sobre o problema do acidente, eu recomendaria uma pega de viagem em vez de um observador. (Não se esqueça de re-lidar com grandes exceções)
[STAThread]
static void Main()
{
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
catch(Exception ex)
{
//log the exception here
Application.Restart();
}
}
Como você diz que usa um aplicativo Windows Forms, não pode usar um serviço do Windows para isso, pois um serviço do Windows não tem permissão para ter uma GUI.
O que eu faria e criaria um aplicativo "Watchdog" invisível que monitora o processo e o reinicie automaticamente quando trava.
Você pode experimentar o bloco de captura em torno do código que provavelmente está causando o acidente. Em seguida, escreva a mensagem de exceção em um arquivo de log. Você também pode definir um ponto de depuração no bloco de captura para ver outros detalhes, como pilha de chamadas, etc.