2009-03-30 17 views
11

Ich bin dabei, eine Konsolenanwendung zu entwickeln, die zu bestimmten Zeiten kontinuierlich ausgeführt und ausgeführt werden muss.C# Konsolenanwendung - Keep it running

Meine Frage ist, was sind die besten Methoden oder Praktiken, um Ihre Anwendung am Leben zu erhalten?

Meine Gedanken waren: Eine Schleife, die nie endet? Ein Timer, der schläft und dann bei Bedarf zur Routine springt (nach der eingestellten Schlafperiode)?

Ich werde die Anwendung in eine EXE kompilieren und dann als einen Dienst mit AlwaysUp ausführen.

Grüße ..

Peter

+0

Der Grund, warum Sie so viele verschiedene Arten von Antworten erhalten haben, ist, dass Sie nicht viele Informationen darüber gegeben haben, was diese Sache tun wird. Mit mehr Informationen können Sie einige der bisher vorgestellten Optionen eingrenzen. – Cheeso

Antwort

8

Warum nicht Sie Ihre Anwendung als Service an erster Stelle bauen?

+0

Windows sollte Dienste verwenden, da dies das Modell ist, das es am besten unterstützt, nicht sicher, wer Sie auf diesem heruntergeschnüffelt hat. – ojblass

2

Code, der kontinuierlich ausgeführt wird, wird als Daemon bezeichnet, und es gibt einen Artikel here, der beschreibt, wie Sie tun können, was Sie fragen. Das zeigt Ihnen ein Beispiel für das Schreiben eines einfachen Dienstes here.

+0

Ja, dachte über einen Dienst nach, aber denke nicht, dass es meinen Anforderungen entspricht, da ich Dateien verarbeiten und Konfigurationsinformationen aus einer gespeicherten Datei lesen muss, um zu bestimmten Zeiten zu arbeiten, wie in der Konfigurationsdatei angegeben. –

3

Sie möchten wahrscheinlich nicht einfach in einer Schleife unnötige Prozessorzeit drehen.

Angenommen, Sie sind auf Windows, sollten Sie eine Schleife haben, die nie mit einem Aufruf von WaitForSingleObject() oder WaitForMultipleObjects() oder MsgWaitForMultipleObjects() endet, je nach Ihren Bedürfnissen. Dann haben Sie ein Synchronisationsobjekt, das Sie aufweckt, z. B. ein benanntes Ereignis.

Weitere Informationen finden Sie in der Win32-Synchronisationsdokumentation here. Wenn Sie näher auf das eingehen, was Ihr Programm zu tun hat, können wir wahrscheinlich genauere Ratschläge geben.

+0

Hallo, Danke für das Update, der Grund, warum ich dies als Konsolenanwendung ausgewählt habe, ist, dass es mir dann die Möglichkeit gibt, es jederzeit manuell auszuführen. Die Anwendung liest eine Konfigurationsdatei und führt eine Datei zu einem bestimmten Zeitpunkt aus den in der Konfigurationsdatei gespeicherten Informationen aus. –

+0

Muss auch eine Benachrichtigungs-E-Mail senden, wenn eine Datei in einem bestimmten Verzeichnis fehlt. Wenn die Datei existiert, muss sie geöffnet und gelesen werden, um nach Fehlern zu suchen, irgendwelche Fehler, dann muss auch eine Benachrichtigungs-E-Mail gesendet werden. –

1

Nun, ich bin sicher, irgendwann sollte es aufhören, nicht?

Spawn ein Thread, der funktioniert, und haben den Haupt-Thread-Block auf Console.ReadLine(), wenn Sie möchten, dass es auch als eine Konsole App ausgeführt werden kann.

Wenn Sie wirklich den Hauptfaden für immer pausieren möchten, blockieren Sie einfach auf einem ManualResetEvent, das Sie nie feuern.

Verwenden Sie jedoch einen Dienst, wenn Sie können.

2

Wenn Ihr Programm kontinuierlich ausgeführt wird, sollten Sie so lange schlafen, bis das gewünschte Ereignis eintritt (z. B. XX Sekunden). Wenn Sie nur eine Weile {} Schleife drehen, werden Sie CPU-Zeiten aufsaugen.

Wenn Ihr Programm immer auf einer Maschine ausgeführt wird, sollten Sie es als Service betrachten, damit es automatisch mit der Maschine startet und stoppt.

13

Eine bessere Lösung wäre, eine Konsolenanwendung zu schreiben, die ihre Arbeit erledigt und beendet. Sie können dann den Windows Taskplaner verwenden, um es regelmäßig auszuführen.

+2

Absolut einverstanden! Jon Galloway hat vor einiger Zeit einen Blogeintrag geschrieben, der mich davon überzeugt hat, dass ich es falsch mache, indem ich einen Dienst statt einer Aufgabe mache: http://weblogs.asp.net/jgalloway/archive/2005/10/24/428303.aspx –

+0

Ich denke, dass Dienste mehr Flexibilität in Bezug auf Benutzeranmeldeinformationen bieten. – ojblass

+0

Zumindest so weit wie ich gesehen habe, können Sie die Anmeldeinformationen festlegen, unter denen die geplante Aufgabe ausgeführt wird. Was können Sie mit einem Service tun, den Sie nicht mit einer Aufgabe verbinden können? –

1

Wenn Sie eine Desktopanwendung erstellen, möchten Sie, dass sie in der Taskleiste ausgeführt wird.Dies wird

  1. Benutzer Halten Sie versehentlich die Anwendung schließen
  2. Halten Sie Ihre Anwendung von Poltern den Bildschirm Ihres Benutzer

Wenn eine Server-Anwendung bauen wollen Sie einen Windows-Dienst schreiben. Dies wird

  1. einen Administrator Halten Sie versehentlich Ihre Anwendung
  2. Beseitigen Sie die Notwendigkeit für den Server zu schließen, jemanden zu haben in die Konsole für Ihre Anwendung angemeldet

Als jemand ausgeführt werden, die in erster Linie ist Ein IT-Pro Ich würde sagen, dass 3rd-Party-Anwendungen, die wir als Konsolen-Apps anstelle von Windows-Diensten ausführen, wir viel Mühe darauf verwenden, nicht gekauft zu werden. Es schafft viel Arbeit für uns und eröffnet erhebliche Support-Probleme und Sicherheitslücken.

1

Einen Thread in den Ruhezustand senden: System.Threading.Thread.Sleep (10000);

Warten auf eine Taste: Console.WriteLine ("Drücken Sie eine beliebige Taste, um fortzufahren ..."); Konsole.Read();

+0

Thread-Schlaf lässt die Software langsamer zuweisen und sollte nicht verwendet werden. Sie sollten AutoResetSignal für eine Konsolenanwendung verwenden oder einen Dienst erstellen, wenn die gesamte Zeit ausgeführt werden muss. – ppumkin

3

Sie können eine Referenz zu System.Windows.Forms hinzufügen und System.Windows.Forms.Application.Run() aufrufen, um eine standardmäßige Anwendungsnachrichtenschleife zu beginnen. Ctrl-C wird die App beenden.

Eine andere Möglichkeit ist, Console.ReadKey() zu verwenden, um die App anzuhalten. Wie Console.WriteLine("Press [ANY] key to quit..."); Console.ReadKey();

Das ist, was ich in meinen Konsolen-Apps verwende, wenn sie nur dort sitzen und auf Ereignisse warten. In beiden Fällen wird die App weiterhin ausgeführt und löst ausgelöste Ereignisse aus (z. B. von einem Timer, WCF, FileWatcher usw.).

2

Während Sie sollten wirklich einen Dienst für diese verwenden möchten, wenn Sie brauchen/wollen dies trotzdem tun, können Sie eine ManualResetEvent, dies zu tun:

private ManualResetEvent Wait = new ManualResetEvent(false); 

Wenn Sie fertig sind ‚Start‘ und wollen einfach nur warten, würden Sie dann tun:

Wait.WaitOne(); 

Wenn Sie aufhören wollen und lassen Sie es verlassen, können Sie dann tun:

Wait.Set();