Application console C # - Continuez à courir
Je suis sur le point de développer une application console qui sera nécessaire pour continuellement exécuter et accomplir un travail à des heures spécifiques.
Ma question est qu'est-ce que sont les meilleures méthodes ou pratiques pour garder votre demande en vie?
Ma pensée étaient les suivants:
Une boucle qui ne s'arrête jamais?
Une minuterie qui dort et puis saute à la routine en cas de besoin (après période de sommeil)?
Je vais être la compilation de l'application dans un fichier exe puis de l'exécuter en tant que service à l'aide de AlwaysUp.
Ce qui concerne..
Peter
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Une meilleure solution serait d'écrire une application console qui fait son travail et se ferme. Vous pouvez ensuite utiliser le Planificateur de Tâches de Windows pour exécuter périodiquement.
Pourquoi ne pas vous construisez votre application en tant que service, en premier lieu?
Vous ne voulez probablement pas à vient de tourner dans une boucle inutilement qui consomme du temps processeur.
En supposant que vous êtes sous windows, vous devriez avoir une boucle qui ne se termine jamais par un appel à WaitForSingleObject() ou WaitForMultipleObjects() ou MsgWaitForMultipleObjects() en fonction de vos besoins. Ensuite, la synchronisation de l'objet que vous réveille, comme un événement nommé.
Voir la Synchronisation Win32 documentation ici. Si vous donner plus de détails sur ce que votre programme doit le faire, on peut probablement fournir des conseils plus spécifiques.
Vous pouvez ajouter une référence à
System.Windows.Forms
et appelSystem.Windows.Forms.Application.Run()
pour commencer une application standard boucle de message. Ctrl-C mettra fin à l'application.Une autre option est d'utiliser
Console.ReadKey()
pour mettre en pause l'application. CommeConsole.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();
C'est ce que j'utilise dans ma console d'applications quand ils sont juste assis là à attendre que les événements se produisent. Dans les deux cas, l'application continuera de courir et attraper déclenché des événements (comme à partir d'un minuteur, WCF, FileWatcher, etc).
Alors vous devez vraiment être à l'aide d'un service pour ça, si vous avez besoin/envie de le faire de toute façon, vous pouvez utiliser un
ManualResetEvent
pour ce faire:Lorsque vous avez fini de 'départ' et veulent juste attendre, vous pouvez le faire:
Lorsque vous souhaitez arrêter et le laisser sortir, vous pourrez alors faire:
Code qui fonctionne en permanence est appelé un démon et il y a un article
ici expliquant comment faire ce que vous demandez. Que vous pointez sur un exemple de la façon d'écrire une simple service ici.
Si votre programme va être continuellement en cours d'exécution, puis vous devriez dormir jusqu'à l'obtention d'événement se produit (par exemple, XX secondes passes). Si vous venez de tourner dans un while {} boucle vous aurez aspirer de temps de calcul.
Si votre programme va toujours être en cours d'exécution sur une machine, alors vous devriez envisager de faire un service de sorte qu'il démarre et arrête automatiquement la machine.
Eh bien, je suis sûr qu'à un certain point, il devrait s'arrêter, non?
Frayer un fil qui ne fonctionne pas, et ont le thread principal sur le bloc de la Console.ReadLine() si vous voulez qu'il soit praticable comme une application console.
Si vraiment vous voulez juste pour mettre en pause le thread principal pour toujours, il suffit de le bloquer sur un ManualResetEvent vous n'avez jamais le feu.
Mais, pensez à utiliser un service, si vous le pouvez.
Si votre bâtiment d'une application de bureau, vous aurez envie de le faire exécuter dans la barre d'état système. Ce sera
Si votre bâtiment une application serveur, vous voulez écrire un service windows. Ce sera
Comme quelqu'un qui est avant tout un professionnel de l'informatique, je dirais que les applications 3ème partie que nous obtenons exécuter en tant que console applications au lieu de windows services, nous avons mis beaucoup d'efforts dans le maintien d'être acheté. Il crée beaucoup de travail pour nous, et ouvre d'importantes questions de soutien et des trous de sécurité.
L'envoi d'une mise en veille du thread:
Système.Le filetage.Fil de discussion.Sleep(10000);
En attente d'une touche à presser:
Console.WriteLine("Appuyez sur une touche pour continuer...");
Console.Read();