2009-03-30 6 views
11

Je suis sur le point de développer une application de console qui sera nécessaire pour exécuter et effectuer du travail en continu à des moments précis.C# Console Application - Continuez à fonctionner

Ma question est de savoir quelles sont les meilleures méthodes ou pratiques pour maintenir votre application en vie?

Mes pensées étaient: Une boucle qui ne finit jamais? Une minuterie qui dort et passe ensuite à la routine si nécessaire (après une période de sommeil définie)?

Je vais compiler l'application dans un exe et ensuite l'exécuter en tant que service en utilisant AlwaysUp.

Cordialement ..

Peter

+0

La raison pour laquelle vous avez reçu tant de réponses différentes est que vous n'avez pas donné beaucoup d'informations sur ce que cette chose va faire. Avec plus d'informations, vous serez en mesure d'affiner certaines des options présentées jusqu'à présent. – Cheeso

Répondre

8

Pourquoi ne pas construire votre application en tant que service en premier lieu?

+0

WIndows devrait utiliser les services car c'est le modèle qu'il supporte le mieux, mais vous ne savez pas qui vous a bloqué sur celui-ci. – ojblass

2

Le code qui s'exécute continuellement s'appelle un démon et il y a un article here décrivant comment faire ce que vous demandez. Cela vous dirigera vers un exemple de comment écrire un service simple here.

+0

Oui, je pense à un service mais je ne pense pas qu'il répondra à mes besoins car j'ai besoin de traiter des fichiers et de lire les informations de configuration à partir d'un fichier stocké pour travailler à des moments spécifiques spécifiés dans le fichier de configuration. –

3

Vous ne voulez probablement pas simplement tourner dans une boucle consommant inutilement du temps de 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. Ayez ensuite un objet de synchronisation qui vous réveille, tel qu'un événement nommé.

Voir la documentation Win32 Synchronization here. Si vous développez davantage sur ce que votre programme doit faire, nous pouvons probablement fournir des conseils plus spécifiques.

+0

Salut, Merci pour la mise à jour, la raison pour laquelle j'ai choisi de faire cela en tant qu'application console est que cela me donne alors la possibilité de l'exécuter manuellement à tout moment. L'application lira un fichier de configuration et exécutera un fichier lu/traité à un moment donné à partir des informations stockées dans le fichier de configuration. –

+0

Vous devrez également envoyer un e-mail d'alerte si un fichier est manquant dans un répertoire certian. Si le fichier existe, il doit être ouvert et lu à la recherche d'erreurs, toutes les erreurs, puis un e-mail d'alerte doit également être envoyé. –

1

Eh bien, je suis sûr qu'à un moment donné, ça devrait s'arrêter, non?

Générer un thread qui fonctionne et avoir le bloc thread principal sur Console.ReadLine() si vous voulez qu'il soit exécutable en tant qu'application console.

Si vous voulez vraiment mettre en pause le thread principal pour toujours, bloquez simplement un ManualResetEvent que vous ne déclenchez jamais.

Mais, pensez à utiliser un service si vous le pouvez.

2

Si votre programme doit fonctionner en continu, vous devez dormir jusqu'à ce que l'événement souhaité se produise (par exemple, XX secondes). Si vous tournez juste dans une boucle while {}, vous allez absorber les temps CPU.

Si votre programme doit toujours être en cours d'exécution sur une machine, vous devriez envisager d'en faire un service afin qu'il démarre et s'arrête automatiquement avec la machine.

13

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 Windows pour l'exécuter périodiquement.

+2

Tout à fait d'accord! Jon Galloway a écrit un post de blog il y a quelque temps qui m'a convaincu que je le faisais mal en faisant un service au lieu d'une tâche: http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx –

+0

Je pense que les services offrent plus de flexibilité en termes d'informations d'identification de l'utilisateur. – ojblass

+0

Au moins autant que je l'ai vu, vous pouvez définir les informations d'identification que la tâche planifiée va exécuter. Que pouvez-vous faire avec un service que vous ne pouvez pas avec une tâche? –

1

Si vous créez une application de bureau, vous devez l'exécuter dans la barre d'état système.Cela

  1. Gardez vos utilisateurs de fermer accidentellement l'application
  2. Gardez votre application d'encombrer l'écran de vos utilisateurs

Si votre création d'une application de serveur que vous voulez écrire un service Windows. Cela

  1. Gardez à courir dans

un administrateur de fermer accidentellement votre application

  • Éliminer la nécessité pour le serveur d'avoir quelqu'un connecté à la console pour votre application Comme quelqu'un qui est avant tout un pro de l'informatique Je dirais que les applications tierces que nous faisons fonctionner comme des applications de console au lieu des services Windows, nous avons mis beaucoup d'efforts pour ne pas être achetés. Cela crée beaucoup de travail pour nous et ouvre des problèmes de support importants et des failles de sécurité.

  • 1

    Envoi d'un thread pour dormir: System.Threading.Thread.Sleep (10000);

    En attente de la pression d'une touche: Console.WriteLine ("Appuyez sur une touche pour continuer ..."); Console.Read();

    +0

    Thread sleep rend le logiciel plus lent et ne doit pas être utilisé. Vous devez utiliser AutoResetSignal pour une application de console ou créer un service s'il doit s'exécuter tout le temps. – ppumkin

    3

    Vous pouvez ajouter une référence à System.Windows.Forms et appeler le System.Windows.Forms.Application.Run() pour démarrer une boucle de message d'application standard. Ctrl-C mettra fin à l'application.

    Une autre option consiste à utiliser Console.ReadKey() pour mettre l'application en pause. Comme Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

    C'est ce que j'utilise dans mes applications de console lorsqu'elles sont juste là en attente d'événements. Dans les deux cas, l'application continuera de fonctionner et d'intercepter les événements déclenchés (comme une minuterie, WCF, FileWatcher, etc.).

    2

    Alors que vous devriez vraiment utiliser un service pour cela, si vous avez besoin/voulez faire cela de toute façon, vous pouvez utiliser un ManualResetEvent pour ce faire:

    private ManualResetEvent Wait = new ManualResetEvent(false); 
    

    Lorsque vous avez terminé « à partir » et veulent juste attendre, vous auriez alors faire:

    Wait.WaitOne(); 
    

    Lorsque vous voulez arrêter et laisser la sortie, vous pouvez faire:

    Wait.Set(); 
    
    Questions connexes