Ich habe eine Windows-Dienstanwendung erstellt. Es wird abhängig von den App-Einstellungen ausgeführt, die in der Datei app.config enthalten sind. Es wird gleichzeitig an verschiedenen Orten (Netzwerken, PCs) installiert. Jeder Standort muss seine eigenen Parameter in der app.config-Datei festlegen. Daher möchte ich nicht, dass es nach der Installation automatisch ausgeführt wird. Auf diese Weise können Benutzer die Konfigurationsdatei öffnen und ändern. Dann können sie den Dienst starten. Aber danach wird der Dienst für immer laufen. Auch wenn sie die Windows neu starten, wird es automatisch nach dem Öffnen von Windows ausgeführt.Windows-Dienst automatisch für immer ausführen, nach dem ersten manuellen Start
Hier ist meine Installer-Klasse. Es wird nicht automatisch nach der Installation ausgeführt. Das ist gut. Aber wenn ich es manuell starte und den PC neu starte, wartet der Neustart nach dem Neustart darauf, manuell gestartet zu werden. Was soll ich machen?
public partial class MyServiceInstaller : System.Configuration.Install.Installer
{
ServiceInstaller _serviceInstaller = new ServiceInstaller();
ServiceProcessInstaller _processInstaller = new ServiceProcessInstaller();
string _serviceName = "MyService";
string _displayName = "My Service";
string _description = "My Service - Windows Service";
public MyServiceInstaller()
{
InitializeComponent();
this.BeforeInstall += new InstallEventHandler(MyServiceInstaller_BeforeInstall);
_processInstaller.Account = ServiceAccount.LocalSystem;
_serviceInstaller.StartType = ServiceStartMode.Automatic;
_serviceInstaller.Description = _description;
_serviceInstaller.ServiceName = _serviceName;
_serviceInstaller.DisplayName = _displayName;
Installers.Add(_serviceInstaller);
Installers.Add(_processInstaller);
}
protected override void OnCommitted(System.Collections.IDictionary savedState)
{
ServiceController sc = new ServiceController(_serviceName);
if (sc.Status != ServiceControllerStatus.Running)
{
TimeSpan timeout = TimeSpan.FromMilliseconds(10000);
sc.Start();
sc.WaitForStatus(ServiceControllerStatus.Running, timeout);
sc.Stop();
}
else
{
RestartService(10000);
}
}
private void RestartService(int timeoutMiliseconds)
{
ServiceController service = new ServiceController(_serviceName);
int millisec1 = Environment.TickCount;
TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMiliseconds);
service.Stop();
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);
int millisec2 = Environment.TickCount;
timeout = TimeSpan.FromMilliseconds(timeoutMiliseconds - (millisec2 - millisec1));
service.Start();
service.WaitForStatus(ServiceControllerStatus.Running, timeout);
}
void MyServiceInstaller_BeforeInstall(object sender, System.Configuration.Install.InstallEventArgs e)
{
List<ServiceController> services = new List<ServiceController>(ServiceController.GetServices());
foreach (ServiceController s in services)
{
if (s.ServiceName == this._serviceInstaller.ServiceName)
{
ServiceInstaller ServiceInstallerObj = new ServiceInstaller();
ServiceInstallerObj.Context = new System.Configuration.Install.InstallContext();
ServiceInstallerObj.Context = Context;
ServiceInstallerObj.ServiceName = _serviceName;
ServiceInstallerObj.Uninstall(null);
}
}
}
}
Ihr Code scheint den Starttyp auf Automatisch zu setzen. Können Sie das Ereignisprotokoll überprüfen, um zu sehen, ob Ihr Dienst versucht, automatisch zu starten, aber fehlgeschlagen. Dies kann passieren, wenn Ihr Dienst von einem anderen Dienst abhängig ist, der noch nicht gestartet wurde. – sgmoore
@sgmoore danke für deinen Kommentar. Ich erkannte, dass mein Code von einem anderen Code abhängt, der einige Zeit warten muss, bevor er nach dem Neustart ausgeführt wird. Schreibe dies bitte als Antwort und ich werde es markieren. –