2013-09-24 7 views
2

J'ai une application console qui sera exécutée le week-end. Et quand je reviendrai au travail, j'aurai besoin de le terminer en toute sécurité.Quitter la console en toute sécurité?

Il exécute une boucle et modifie les fichiers en les déplaçant et en mettant à jour une base de données.

Je ne peux pas simplement Ctrl-Z pour quitter ce que je suppose que cela pourrait arrêter le programme au milieu de travailler sur un fichier?

Yat-il un moyen sûr pour moi de dire appuyer sur la touche « c » pour régler mon runLoopboolean à false donc ce serait quitter ma boucle correctement ou est-il une meilleure façon? Quelle est la manière la plus sûre de mettre fin à cette boucle et de s'assurer que le fichier en cours sera terminé avec succès?

static void Main(string[] args) 
{ 
    bool runLoop = true; 

    while (runLoop) 
    { 
      // bunch of code 
      // moving files, updating database. 
    } 
} 

Répondre

4

Vous pouvez facilement ajouter un gestionnaire à un événement exposé à vous lorsque cette commande est pressée et l'utiliser pour signaler l'annulation:

bool runLoop = true; 

ManualResetEvent allDoneEvent = new ManualResetEvent(false); 
Console.CancelKeyPress += (s, e) => 
{ 
    runLoop = false; 
    allDoneEvent.WaitOne(); 
}; 

int i = 0; 
while (runLoop) 
{ 
    Console.WriteLine(i++); 
    Thread.Sleep(1000); //placeholder for real work 
} 

//for debugging purposes only 
Console.WriteLine(); 
Console.WriteLine("press any key to exit . . ."); 
Console.ReadKey(true); 

allDoneEvent.Set(); 

Notez que l'ensemble du processus sera tué lorsque ce gestionnaire d'événements se termine, Vous devez donc également vous assurer que ce gestionnaire d'événements est en cours d'exécution jusqu'à ce que le reste du programme puisse se terminer correctement.

+0

J'ai ajouté cela, a couru mon programme et appuyé sur Ctrl-C. Cela a laissé la fenêtre de la console ouverte, il a effectivement arrêté le programme mais je ne suis pas sûr de l'endroit où il s'est arrêté. J'ai dû frapper le jeu pour continuer le programme ou arrêter. Cela n'a pas agi comme si runLoop était faux car je l'ai fait imprimer compte quand cela arrive. Y a-t-il autre chose que je pourrais manquer? –

+0

@JamesWilson À droite, il va tuer le processus lorsque ce gestionnaire d'événements se termine; vous devez vous assurer que ce gestionnaire d'événements survit au reste du processus. – Servy

+0

@jgauffin escape n'a rien fait. Et j'utilisais ce site comme référence pour frapper Ctrl-C. http://msdn.microsoft.com/en-us/library/system.console.cancelkeypress.aspx –

Questions connexes