2011-01-06 10 views
8

Alcune spiegazioni: per un progetto su cui sto lavorando Devo scrivere un programma in esecuzione in background, rileva le modifiche a file e carica i file modificati su un servizio Web per renderli disponibili agli altri. Abbastanza semplice sincronizzazione se non fosse per il caso in cui un utente modifica un grosso file e decide di spegnere il suo computer subito dopo la modifica.C# - Come rilevare un arresto/disconnessione di Windows e annullare quell'azione (dopo aver chiesto all'utente)

Posso annullare il caricamento e attendere il riavvio successivo per eseguire il caricamento, ma posso immaginare l'utente che scarica il file dal web su un altro computer la mattina successiva e non capisco perché i suoi cambiamenti dalla scorsa notte non sono ci sono.

Quindi la mia idea era di rilevare quando gli utenti si disconnettevano o riavviano Windows, e se sono nel mezzo di un caricamento, solo chiedendo all'utente "Stiamo ancora sincronizzando il file Foo.txt che hai appena cambiato. sicuro di voler riavviare? Le modifiche non saranno disponibili per gli altri fino al riavvio del computer! ". Se gli utenti dicono no, avrei bisogno di annullare il riavvio/la disconnessione

È possibile?

risposta

8

C'è una classe statica denominata SystemEvents che espone questo comportamento:

http://msdn.microsoft.com/en-us/library/microsoft.win32.systemevents.aspx

Tuttavia, non si può distinguere tra determinate azioni e non mettere in pausa la guardia time-out di processo del sistema operativo. L'ho usato una volta, ma il timeout predefinito come configurato nel registro è un po 'breve quindi è probabile che sia necessario aumentare.

Per farla breve, tutto sembrava un po 'logoro.

+0

OK questo è quello che pensavo ... Allora lascerò andare questo comportamento. Un'altra idea che ho è mostrare il progresso del caricamento in una finestra semitrasparente in ogni momento. Gli utenti vengono quindi messi a conoscenza del lavoro che sta avvenendo dietro la scena e probabilmente non verranno arrestati in quel caso. –

+0

@Sebastien a dire il vero, vorrei dare un servizio come suggerito da Hans. Rendi il caricamento robusto in modo tale che possa essere ripreso e avvolgere tutto in un servizio in modo che l'utente non debba riavviarlo tutto manualmente. –

+0

Questo è più o meno il comportamento che avrei adottato quando ho detto "lascerò andare questo comportamento". Stavo solo pensando di aggiungere un progresso di caricamento discreto solo per far sapere all'utente. Certo, potrebbe non essere necessario se sono forniti curriculum. Immagino di essere solo un po 'nervoso per l'idea di un utente che va a casa con il suo notebook e file non sottoposti a backup nel sistema ... –

4

Per aggiungere a @ la risposta di Adam, se è necessario indicare la differenza tra disconnessione e spegnimento/riavvio, è possibile gestire il messaggio WM_QUERYENDSESSION.

"Shutdown Changes for Windows Vista" è un articolo utile per comprendere il timeout di spegnimento.

+0

grazie per quello. Non ho avuto la possibilità di aggiungerlo (ho dovuto prendere il mio treno) ma la mia situazione stava dicendo la differenza tra l'arresto e il riavvio in modo da poter riprendere l'azione dell'utente una volta che avevo gestito l'interruzione del lavoro. Non penso sia possibile differenziare quei due. Penso anche che gli eventi ti forniscano alcune informazioni sull'azione? –

+0

La classe 'SystemEvents' non ti dice cosa è successo; 'WM_QUERYENDSESSION' può solo dirti la differenza tra disconnesso da powerdown o riavvio.Su Windows non è possibile distinguere tra un powerdown e un riavvio mentre il sistema si sta spegnendo. –

+0

ah sì. Ho trovato il mio vecchio codice la scorsa notte e ho scoperto che stavo usando questo messaggio! Fortunatamente, il codice era una dimostrazione di un capo precedente e non ha mai visto la luce del giorno. –

3

Cercando di bloccare uno spegnimento è una proposta allentata in questi giorni, non è più possibile farlo in Vista e fino. Un prompt non è leggibile né raggiungibile. L'utilizzo di un servizio è molto indicato qui, ti consente di sopravvivere a una disconnessione dell'utente. E un riavvio, il servizio riprenderà a funzionare automaticamente, permettendoti di completare il lavoro.

Problemi correlati