Domanda

Abbiamo uno SmartClient incorporato in C # che rimane ostinatamente aperto quando il PC su cui è in esecuzione viene riavviato. Ciò interrompe il processo di riavvio a meno che l'utente non chiuda SmartClient per la prima volta o non vi siano altri interventi manuali.

Ciò sta causando problemi quando il team dell'infrastruttura installa in remoto un nuovo software che richiede il riavvio della macchina.

Qualche idea su come far sì che l'app SmartClient riconosca l'evento di arresto / riavvio da Windows e si uccida con grazia?

UPDATE: Questa è un'applicazione altamente threaded con più thread gui. sì, più thread gui. È davvero un consolidamento di molti progetti che di per sé potrebbero essere applicazioni autonome - tutti i quali sono lanciati e gestiti da un unico exe che centralizza quei metodi di gestione e tiene traccia di quei thread. Non credo che usare le discussioni in background sia un'opzione.

È stato utile?

Soluzione

OK, se hai accesso all'app, puoi gestire l'evento SessionEnded.

...
Microsoft.Win32.SystemEvents.SessionEnded +=new
  Microsoft.Win32.SessionEndedEventHandler(shutdownHandler);

...

private void shutdownHandler(object sender, Microsoft.Win32.SessionEndedEventArgs e) {
  // Do stuff
}

Altri suggerimenti

Deve essere un thread che continua a essere eseguito impedendo la chiusura dell'applicazione. Se stai usando il threading, una soluzione semplice sarebbe quella di impostarlo in background.

  

Un thread è un thread in background o un thread in primo piano. I thread in background sono identici ai thread in primo piano, tranne per il fatto che i thread in background non impediscono la chiusura di un processo. Una volta terminati tutti i thread in primo piano appartenenti a un processo, il runtime del linguaggio comune termina il processo. Eventuali thread in background rimanenti vengono arrestati e non completati.

     

http://msdn.microsoft.com /en-us/library/system.threading.thread.isbackground.aspx

Quando un utente si disconnette o Windows viene chiuso, il messaggio WM_QUERYENDSESSION viene inviato a tutte le finestre di livello superiore. Vedi Documentazione MSDN qui.

Il comportamento predefinito di un'applicazione WinForm in risposta a questo messaggio è di attivare l'evento FormClosing con CloseReason == WindowsShutDown o altri. Il gestore dell'evento, tuttavia, può scegliere di essere testardo e rifiutare di chiudere l'app, mantenendo così il sistema in esecuzione.

Controlla i gestori FormClosing delle tue applicazioni. Forse c'è qualcosa dentro. Ho visto questo genere di cose un paio di volte.

O forse l'app .Net sta ignorando di proposito i messaggi di chiusura o chiusura?

I thread in background erano una soluzione rapida e sporca, la soluzione migliore è usare gli oggetti di sincronizzazione ( ManualResetEvent , Mutex o qualcos'altro) per fermare gli altri thread;

Oppure tieni traccia di tutte le finestre aperte e invia il messaggio WM_CLOSE alla chiusura dell'app principale.

Devi fornire maggiori informazioni su come avviare quelle applicazioni con la GUI. forse avvii un thread per ogni applicazione e chiami Application.Run (new Form1 ()); ?

Puoi anche cercare di creare un AppDomain per ogni applicazione GUI

Normalmente un'app .Net rispondeva correttamente, almeno, questo è il comportamento "out of the box". In caso contrario, potrebbero esserci diverse cose. La mia ipotesi migliore senza sapere nulla di più sul tuo programma è che hai un processo di lunga durata nel thread dell'interfaccia utente principale che impedisce all'app di rispondere ai messaggi della finestra.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top