Autor |
Beitrag |
Vegeto
Beiträge: 262
|
Verfasst: Do 20.06.13 11:52
Moin Moin,
bin gerade etwas auf dem Schlauch und weiß nicht mehr weiter :/
Bin dabei eine Windows Dienst zu erstellen, habe auch ein gutes Tutorial gefunden: Erstellen einer Windows-Dienstanwendung im Komponenten-Designer und habe mir das durch gelesehen, weiß auch nun was mit OnStart und OnStop ( und den anderen Methoden) passiert.
Doch irgendwie komme ich nicht mehr weiter. Ich will ein Dienstschreiben der in einer Datenbank einige Daten schreibt, sprich eine neue Tabelle wird erstellt.
Das ist für mich kein problem, doch wo schreibe ich diesen Code rein?
Und wie kann ich einen Timer auf mein Dienst anwenden?
Ich hoffe jmd kann mir weiter helfen.
Lg
Moderiert von Th69: URL-Formatierung geändert
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 20.06.13 12:59
Zitat: | Das ist für mich kein problem, doch wo schreibe ich diesen Code rein? |
Auslösend eigentlich immer in OnStart.
Wenn dein Service einfach regelmäßig irgendwas tun soll dann würdest du halt von dort aus deinem Timer starten und in OnStop anhalten.
Als Timer solltest du den aus dem System.Timers oder den aus System.Threading Namespace nehmen. Der aus Winforms z.B. wäre ungeeignet.
|
|
Vegeto
Beiträge: 262
|
Verfasst: Do 20.06.13 13:14
Ahh..
also einfach in OnStart rein schreiben und das wars.
dann könnte ich in OnStop meine LogFile beschreiben lassen nicht wahr?
Denn OnStop wird dann ausgelöst wenn der Dienst beendet wird.
Oder habe ich hier was falsch verstande?
Lg
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 20.06.13 13:46
Kommt darauf was du genau tust. Das relevante hätte ich gedacht passiert in der Timer Methode den du in OnStart gestartet hast. Wenn du zu dem was du tust auch ein Log File schreiben willst würde ich das auch in der Timer Methode tun. In OnStop hört sich falsch an. Ein Service ist ja dazu gedacht das er 24/7 läuft. Potentiell wird also OnStop für Monate/Jahre nicht aufgerufen. Oder zumindest erst wenn der Rechner runtergefahren wird.
|
|
Vegeto
Beiträge: 262
|
Verfasst: Do 20.06.13 14:47
Okay..
Also im genau will ich halt daten in eine Datenbank schreiben mittels SqlCommand.
zudem soll er das jede stunde machen also nicht durchgehend !
deswegen setze ich timer.intervall auf 60000
und nach jeder stunde soll er halt in die log file datum und uhrzeit rein schreiben und wie viele zeilen hineingeschrieben wurden.
Also muss ich ja bei meinem problem doch die logfile im OnStop bearbeiten nicht wahr?
Lg
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 20.06.13 14:57
Zitat: | Also muss ich ja bei meinem Problem doch die logfile im OnStop bearbeiten nicht wahr? |
Wie kommst du darauf? Welche Methode wird wohl jede Stunde aufgerufen in der du jede Stunde was machen kannst. Die Antwort ist sicher nicht OnStop.
Für diesen Beitrag haben gedankt: Vegeto
|
|
Vegeto
Beiträge: 262
|
Verfasst: Do 20.06.13 15:56
Danke für den gedankenschub
OnStart
Ich werde mich mal dran versuchen, bei fragen poste ich es wieder hier
bis dahin danke sehr
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Do 20.06.13 16:34
Zitat: | OnStart |
Das soll Ironie sein. Richtig?
Für diesen Beitrag haben gedankt: Vegeto
|
|
Vegeto
Beiträge: 262
|
Verfasst: Fr 21.06.13 09:09
ja xD
in OnStart kommt der Teil rein wo ich die log-File beschreibe
oder eine timer funktion ^^
lg
|
|
Vegeto
Beiträge: 262
|
Verfasst: Fr 21.06.13 12:52
Hi.
habe mal jz ein Dienst geschrieben, wollte euch bevor ich das erstelle, euch fragen ob das so richtig ist bist jetzt?
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29:
| System.Timers.Timer serviceTimer;
public Service1() { InitializeComponent();
serviceTimer = new System.Timers.Timer(); serviceTimer.Elapsed += new ElapsedEventHandler(timer_Tick); serviceTimer.Interval = Double.Parse(ConfigurationManager.AppSettings.Get("timer")); }
protected override void OnStart(string[] args) { serviceTimer.Start(); }
protected override void OnStop() { }
void timer_Tick(object sender, EventArgs e) { DoSomething(); }
private void DoSomething() { } |
Ich hoffe ich habe alles richtig verstanden.
Lg
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 21.06.13 13:10
In OnStop den Timer noch stoppen.
|
|
Vegeto
Beiträge: 262
|
Verfasst: Fr 21.06.13 13:33
Okay Danke. habe ich gemacht.
in der DoSomething methode habe ich als letzte funktion ein streamwriter der die log file schreibt, würde es später zu irgendwelchen problemen kommen?
Die Funktion ist so aufgebaut:
C#-Quelltext 1: 2: 3: 4: 5:
| DateTime dtime = DateTime.Now; string zeit = dtime.ToString("Datum: dd.MM.yyyy Uhrzeit: HH:mm:ss"); StreamWriter sw = new StreamWriter(@"C:\Log\LogFile.log", true); sw.WriteLine(zeit); sw.Close(); |
Der schreibt dann immer dann rein, wenn der dienst die funktion/aufgaben erledigt.
Lg
|
|
Ralf Jansen
Beiträge: 4705
Erhaltene Danke: 991
VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
|
Verfasst: Fr 21.06.13 13:49
Bei einem Service ist es wichtig auf Exception und Resourcen zu achten. Denn die laufen ja länger und ein Resourcenleck macht sich irgendwann bemerkbar.
Denn Streamwriter also zum Beispiel mit einem Using Block benutzen damit der garantiert auch geschlossen/Disposed wird.
Und du solltest deine Timer Methode mit einem dichten Exceptionhandling kapseln. Wenn da eine unbehandelte Exception rauskommt läuft dein Service zwar noch aber dann dein Timer nicht mehr.
Für diesen Beitrag haben gedankt: Vegeto
|
|
Vegeto
Beiträge: 262
|
Verfasst: Fr 21.06.13 14:07
Danke sehr.
In jedem catch block den ich habe, habe ich Exception als problem aufgeführt, so werden alle probleme abgefangen
und das mit using setze ich sofort um
Danke
|
|