Entwickler-Ecke

Sonstiges (.NET) - Service


kerstel - So 08.02.15 17:51
Titel: Service
Hallo,

ich möchte einen Service entwickeln der zu einem bestimmten Zeitpunkt Artikeldaten von einem FTP holt und verarbeitet. Ich bin auf folgende Fragen gestoßen:
:: Wie kann ich sagen, dass der Service immer um 23:56 eine bestimmte Funktion ausführt?
:: Wie kann ich einen Prozess von einem externen Programm aus ansteuern? Als Bsp. der Artikelimport läuft immer um 23:56, aus irgend einem Grund müsste er aber jetzt laufen. zb. eine Datei in ein Verzeichnis legen und der Dienst prüft sekündlich ob diese da ist? Ist das so sinnvoll?
:: Wie kann ich den Dienst testen, ohne ihn installieren zu müssen?

Danke für die Hilfe

LG
Ralf


Ralf Jansen - So 08.02.15 18:11

Zitat:
:: Wie kann ich sagen, dass der Service immer um 23:56 eine bestimmte Funktion ausführt?

Dein Service muss irgendwas tun sonst beendet der sich automatisch. Er könnte zum Beispiel regelmäßig die Uhrzeit prüfen und bei Zeiten dann irgendeine Funktion ausführen.
Zitat:
Wie kann ich einen Prozess von einem externen Programm aus ansteuern? Als Bsp. der Artikelimport läuft immer um 23:56, aus irgend einem Grund müsste er aber jetzt laufen. zb. eine Datei in ein Verzeichnis legen und der Dienst prüft sekündlich ob diese da ist? Ist das so sinnvoll?

In dem du ihm ein Interface gibst über das es von jemand anderem angesprochen werden kann. Es gibt da Dutzende von Techniken die man benutzen kann. Alle unter dem Stickwort IPC (Inter Process Communication) zu finden.
Zitat:
:: Wie kann ich den Dienst testen, ohne ihn installieren zu müssen?

Es steht in der Doku [https://msdn.microsoft.com/de-de/library/zt39148a%28v=vs.110%29.aspx] wie man einen Dienst schreibt. Ein Dienst hat eine Main Methode wie jedes andere Programm auch. Also in der Main einfach einen Kommandozeilenparameter abfragen und entweder so starten wie bei jedem Executable oder eben denn üblichen Service Startcode ausführen.

Warum soll das ein Dienst sein? Ein Dienst ist was was ständig im Hintergrund laufen soll. Etwas das einmal am Tag bzw. ganz oder manuell laufen soll würde ich eher als simple Consolenanwendung auslegen und für das regelmäßige ausführen einfach im Windows Taskscheduler einen entsprechenden Ausführungsplan anlegen.


kerstel - So 08.02.15 18:23

Hi,

da werden noch andere sachen rein laufen, weshalb das zu einem Dienst führt :)

Was bedeutet "er muss irgendwas tun"? Wie stellt sich das dar?

LG
Ralf


Jakane - Di 24.02.15 10:26

user profile iconkerstel hat folgendes geschrieben Zum zitierten Posting springen:

Was bedeutet "er muss irgendwas tun"? Wie stellt sich das dar?



Quelltext
1:
2:
3:
4:
5:
6:
7:
procedure TDienst.ServiceExecute(Sender: TService);
begin
  while not Terminated do
  begin
    ServiceThread.ProcessRequests(False);
  end;
end;


Ein Programm läuft bis es Beendet wurde.
Ein Dienst läuft solange er was zu tun hat.

Du musst also nur "verhindern" das er das Beenden erreicht.

Sobald ServiceExecute beendet ist, beendet sich auch der Dienst


Jakane - Di 24.02.15 10:29

user profile iconkerstel hat folgendes geschrieben Zum zitierten Posting springen:
:: Wie kann ich sagen, dass der Service immer um 23:56 eine bestimmte Funktion ausführt?


Ich habe einen Timer in einem DataModul der die Zeit prüft und zur gegebenen Zeit etwas tut.

Ein Problem das ich aber damit nicht lösen konnte ist, dass der Dienst damit immer prüft ob er was tun darf und damit hält er die Serverauslastung auf schwachen PC's / Servern hoch :(


Jakane - Di 24.02.15 10:30

user profile iconkerstel hat folgendes geschrieben Zum zitierten Posting springen:

:: Wie kann ich einen Prozess von einem externen Programm aus ansteuern? Als Bsp. der Artikelimport läuft immer um 23:56, aus irgend einem Grund müsste er aber jetzt laufen. zb. eine Datei in ein Verzeichnis legen und der Dienst prüft sekündlich ob diese da ist? Ist das so sinnvoll?


Auch das Problem kann mit einem DataModul gelöst werden, indem man eine Anwendung schreibt und dort auch manuelles Anstossen ermöglicht


Jakane - Di 24.02.15 10:31

user profile iconkerstel hat folgendes geschrieben Zum zitierten Posting springen:

:: Wie kann ich den Dienst testen, ohne ihn installieren zu müssen?


Ich konnte bisher keinen Dienst testen ohne ihn zu installieren, da der Dienst im Hintergrund läuft.


Ralf Jansen - Di 24.02.15 10:33

Es geht um C# .Net nicht Delphi.


Xion - Di 24.02.15 13:14

user profile iconJakane hat folgendes geschrieben Zum zitierten Posting springen:
Ein Problem das ich aber damit nicht lösen konnte ist, dass der Dienst damit immer prüft ob er was tun darf und damit hält er die Serverauslastung auf schwachen PC's / Servern hoch :(

Du kannst dem Scheduler von Windows normalerweise sagen, dass du nichts zu tun hast. Wenn du weist, zu welchem Zeitpunkt du eine Aktion ausführen möchtest, z.B. um 12:00Uhr, und es ist jetzt 11:00Uhr, dann sag dem Scheduler einfach, dass du 30min nichts zu tun hast.

In Delphi sieht das so aus:

Delphi-Quelltext
1:
  Sleep(30*60*1000)                    

In C# gibts das sicher auch.
Siehe auch: https://en.wikipedia.org/wiki/Sleep_(system_call)