Autor Beitrag
Vegeto
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: 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 user profile iconTh69: URL-Formatierung geändert
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 20.06.13 16:34 
Zitat:
OnStart :)


Das soll Ironie sein. Richtig?

Für diesen Beitrag haben gedankt: Vegeto
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: Fr 21.06.13 09:09 
ja xD

in OnStart kommt der Teil rein wo ich die log-File beschreibe :D

oder eine timer funktion ^^

lg
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: 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?
ausblenden 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")); // hole ich aus der app config, falls man es später anpassen möchte. VALUE ist 60000
        }

        protected override void OnStart(string[] args)
        {
            serviceTimer.Start();
        }

        protected override void OnStop()
        {
        }

        void timer_Tick(object sender, EventArgs e)
        {
            DoSomething();
        }

        private void DoSomething()
        {
            // Funktionen 
        }


Ich hoffe ich habe alles richtig verstanden.

Lg
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Fr 21.06.13 13:10 
In OnStop den Timer noch stoppen.
Vegeto Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: 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:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 262



BeitragVerfasst: 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 :D

Danke