Hallo Leute!!!
Ich habe mal wieder ein Problem, recht speziell, ich habe jetzt mehrere Dienste programmiert und kann sie auch schon ganz gut nutzen, wenn ich allerdings nun den Rechner herunterfahre, dann wird diesen Diensten kein Beenden Signal gesendet, daher beenden sie nicht, bis der PC aus ist. Das normale Beenden ist problemlos moeglich in der Computerverwaltung. Habt ihr ne Ahnung was da im Busch ist? Hab ich vielleicht bei der Installation n Fehler gemacht?
noobie / Anfänger
C# 8) 8)
Welche Resourcen verwenden diese Dienste?
was meinst du mit resourcen?
wenn du den using bereich meinst:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Configuration.Install;
using System.ServiceProcess;
using System.IO;
using System.Threading;
using System.Text;
using MySql.Data.MySqlClient;
noobie / Anfänger
C# 8) 8)
Ressourcen sind ganz allgemein Leistungen der Hardware, des Betriebssystems oder anderer Anwendungen (Bitte nicht mit Manifest-Ressourcen verwechseln). Beispiele für Ressourcen sind *Dateien *Datenbanken *Verzeichnisdienste *Netzwerkverbindungen
Jeder Dienst hat eine OnStop-Methode. In dieser Methode solltest Du alle verwendeten Ressourcen freigeben. Ebenso in der Dispose-Methode. Das bedeutet:*Alle geöffneten Dateien schließen *Alle geöffneten Datenbankverbindungen schließen *Bestehende Verbindungen zu Verzeichnisdiensten trennen *Sonstige Netzwerkverbindungen trennen
Wenn Du das nicht tust, wird Windows den Dienst nicht beenden wollen, weil er noch irgendwelche Ressourcen verwendet. Bei korrekter Implementierung von OnStop und Dispose sollte Dein Dienst auf jedenfall sauber runtergefahren werden können.
ich gebe alle resourcen in dem Thread schon frei wenn diese )Resourcen= nicht mehr verwendet werden! das aller komischte dabei ist ja das wenn ich auf Dienst beenden gehe in der Computerverwaltung das der Dienst sich gany schnieke herunterfährt, aaaaber wenn windows beendet wird, wird gar kein signal von wgen beenden an den Dienst geschickt, daher der Dienst erfaehrt von win gar nicht das er das glueck hat, jetyt ne pause machen zu duerfen, das erkenne ich daran, das sofort wenn die OnStop funktion aufgerufen wird, sder Dienst n Log schreibt, aber das Log enthaelt nichts derartiges... - komisch
noobie / Anfänger
C# 8) 8)
Dann fang die Nachricht zum Herunterfahren selber ab und schließe alle Resourcen und dann sollte es eigentlich gehen. 🤔
Das ist nämlich meine alternativ möglichkeit, wenn niemand noch ne andere idee zum Lösen hat...
Ich bin nämlich an meinen Grenzen damit angekommen, habe alles mögliche probiert - und bin nicht weiter gekommen!
Nie wird der Dienst beendet wenn ich runterfahre!!! Und ihr habt keine Ahnung woran das liegen könnte?
noobie / Anfänger
C# 8) 8)
Hallo albatros,
ich denke MagicAndre1981 meint WindowsFormsApplicationBase.Shutdown. Was ist daran schlecht?
herbivore
die Loesung auf das Herunterfahren des PCs zu reagieren ist zwar eine alternative, sollte allerdings meiner Meinung nach nur als letztes Mittel von mir genutzt werden, der Dienst zieht eh schon, wegen seiner Aufgabe enorm viel Rechenleistung, da muss ich ihm nicht auch noch sagen, das er jede Sekunde pruefen soll, ob der PC herunter gefahren werden soll!
Seit ihr denn voellig ratlos? SOnst hattet ihr doch immer noch ne Idee?
noobie / Anfänger
C# 8) 8)
Hallo albatros,
WindowsFormsApplicationBase.Shutdown zieht keine Rechenleistung, sondern wird nur aufgerufen, wenn es erforderlich ist, nämlich beim Shutdown. Ist ja ein Event.
herbivore
Zitat aus der msdn: "Tritt ein, wenn die Anwendung heruntergefahren wird."
Die Anwendung?!?! glaube nich das das das richtige ist....
noobie / Anfänger
C# 8) 8)
Verwendest Du unmanaged Komponenten (COM-DLLs, Win32-DLLs, etc.) von diesem Dienst aus?
Diese Systeme haben eine ganz andere Speicherverwaltung. Möglicherweise hält ein managed Objekt Deines Dienstes noch einen Verweis auf ein COM-Objekt. COM-Objekte werden zerstört, wenn der letzte verweis auf sie fällt. Bei der Verwendung von COM-Objekten muss man die Verweise darauf in C# explizit zerstören, da man den GC der CLR nicht kontrollieren kann. Das geht so:
System.Runtime.InteropServices.Marshal.ReleaseComObject(comObject);
Original von herbivore
... sondern wird nur aufgerufen, wenn es erforderlich ist, nämlich beim Shutdown. Ist ja ein Event.
so seh ich das auch. Du machst damit doch kein Polling.
ARGHHHH ich drehe durch... So mein einzige Problem war, das ich keine OnShutdown Metode eingebunden habe, und so dieses Event nicht behandelet wurde, jetzt habe ich einfach beim Aufruf von OnShutdown einfach OnStop aufgerufen, so stoppt der Service beim Herunterfahren!!!
Danke fuer die vielen Begleiter!
noobie / Anfänger
C# 8) 8)