2010-08-06 14 views
16

Sto scrivendo un'applicazione di Windows Form in .net usando C#.Come gestisco con garbo le modalità sospensione/sospensione in un'applicazione winforms?

Sto riscontrando un problema che, se il mio programma è in esecuzione quando il computer entra nello stato di sospensione e/o ibernazione (non sono sicuro in quel momento quale o entrambi causano il problema), quando il la macchina si riattiva, il programma si blocca. L'unico modo per uscire da esso è uccidere il processo dal task manager.

Questo è, per ovvi motivi, non il modo in cui voglio che il programma funzioni. Anche se chiudessi il programma quando entra in questi stati, sarebbe perfetto, ma non sono abbastanza sicuro di come farlo o se c'è un modo più aggraziato per gestirlo.

+0

Non so perché hai menzionato lo studio visivo. Il problema si verifica solo quando si esegue il debug in Visual Studio e si iberna/sleep? O hai verificato che ciò accada con un taglio di rilascio con VS chiuso? –

+1

Forse si tratta di informazioni estranee, ma mi piace solo dare quante più informazioni (credo) sull'argomento quando posso presentare una domanda. Per rispondere alla tua domanda, sicuramente accade sulla versione di rilascio su una macchina che non ha nemmeno uno studio visivo su di essa. – EatATaco

+0

Se si desidera fornire informazioni pertinenti, non è necessario fornire informazioni irrilevanti. "Visual Studio" non ha nulla a che fare con la tua domanda. –

risposta

8

è necessario scaricare:

using Microsoft.Win32; 

E questo è il codice:

void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e) 
    { 
     if(e.Mode == PowerModes.Suspend) 
     { 
      this.GracefullyHandleSleep(); 
     } 
    } 

Questo è quello che ho passato con.

2

Questo article copre l'ascolto di quegli eventi. Dovrai fare qualcosa come sostituire lo WndProc e ascoltare gli eventi PBT_APMSUSPEND.

6

La gestione di tali eventi potrebbe essere un modo per aggirare il problema. Ma prima di applicare questo tipo di work-around, proverei a capire cosa stava facendo l'applicazione quando il sistema operativo andò in letargo.

Si verifica in sospeso anche se l'applicazione era semplicemente inattiva?

L'applicazione esegue una sorta di lavoro di basso livello (comunicazione con driver di periferica o hardware esterno) che non deve essere interrotto?

L'applicazione utilizza qualche tipo di connessione di rete?

+0

Effettua il polling di una porta seriale ogni secondo e utilizzo la classe serialport integrata. Il mio istinto mi dice che questo è ciò che sta causando il problema in quanto ho avuto un certo numero di problemi con noti bug nella classe VS serialport. Ma anche in questo caso, la soluzione più rapida è quella di arrestare il programma e siamo stati sottoposti a molto tempo di pressione, quindi probabilmente lo farò per risolvere TUTTI i potenziali problemi. – EatATaco

+0

OK. Prova a chiudere la porta seriale quando ricevi ibernazione/sospensione/attesa e aprilo dopo che il sistema operativo è di nuovo attivo. –

+0

+1 per ottenere alla radice del problema :) –

Problemi correlati