Costante di eseguibile
-
27-09-2019 - |
Domanda
Ho creato un'applicazione WinForm (monitoraggio) utilizzando VS 2005 (C #), e ora, ho un problema quando questa applicazione si blocca per qualche ragione, devo essere sicuro che verrà riavviato automaticamente.
Come posso risolvere questo? (Forse utilizzando un'applicazione Windows servizi?)
Grazie
Soluzione 6
Grazie a tutti voi, la soluzione che ho scelto è: nel programma principale aggiungo un eventi di eccezione (UnhandledExceptionEventHandler & ThreadExceptionEventHandler vedi sopra) in questi eventi ho riavviare il programma (anche mettendo log e-mail a errori di traccia). E per il problema riavvio aggiungo chiave di registro in [HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Run] con il mio percorso di applicazione per essere sicuri che la mia domanda verrà riavviato dopo il riavvio di Windows;)
Altri suggerimenti
Sì, una creazione di un Windows Service avrebbe funzionato come è possibile impostare il riavvio automatico se si blocca, ma un modo migliore sarebbe quello di evitare che schiantarsi in primo luogo! C'è una ragione specifica si blocca?
Con la gestione e reporting è possibile scrivere in modo che esso riporta semplicemente eventuali errori che si verificano e porta via, che secondo me sarebbe la strada migliore da percorrere
buona erroreConsiderate questo:
http://msdn.microsoft.com/en-us/library/ cc303699.aspx
[DllImport("kernel32.dll")]
public static extern int RegisterApplicationRestart(
[MarshalAs(UnmanagedType.BStr)] string commandLineArgs,
int flags);
supportato Minimo server
Windows Server 2008
http://msdn.microsoft.com/en -us / library / aa373347 (VS.85) aspx
La creazione di un servizio di Windows è una buona idea per qualsiasi a lungo in esecuzione processo in background per molte ragioni, tuttavia ri-iniziare un schiantato applicazione non è uno di loro!
Si dovrebbe capire il motivo per cui l'applicazione si blocca e impedire che accada.
Con tutti i mezzi, anche convertire l'applicazione per un servizio di Windows -. Vedrete molti benefici, ma il modo corretto per risolvere il problema è quello di risolvere il crash dell'applicazione in primo luogo
Per * text forte * un'applicazione watcher. È necessario creare un timer sul servizio di Windows e il codice di qualcosa di simile nel caso timer tick:
Process[] procs = Process.GetProcessesByName("you app name");
if (procs.Length == 0)
Process.Start("your app filename");
se davvero non puoi fare nulla circa il problema di crash che consiglierei un try-catch invece di un osservatore. (Non dimenticare di ri-lancio movimentate importanti eccezioni)
[STAThread]
static void Main()
{
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
catch(Exception ex)
{
//log the exception here
Application.Restart();
}
}
Dal momento che si dice che si utilizza un'applicazione di Windows Form non è possibile utilizzare un servizio di Windows per questo, dal momento che un servizio di Windows, non è consentito di avere un'interfaccia grafica.
Quello che vorrei farlo che vorrei creare un'applicazione invisibile "cane da guardia", che controlla il processo e riavvia automaticamente quando si blocca.
Si può mettere un blocco try cattura tutto il codice che è più probabile che la causa del crash. Quindi scrivere il messaggio di eccezione in un file di log. È anche possibile impostare un punto di debug nel blocco catch per vedere altri dettagli come stack di chiamate, ecc.