windows service stoppen in onstart()

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik ben bezig met mijn eerste windows service; tijdens het starten van de service wordt er gecontroleerd of een configuratie file bestaat. Als deze niet bestaat, wordt een entry geschreven naar een specifieke log en de service gestopt met this.Stop(). Dit werkt met een klein schoonheidsfoutje; in de application log wordt eerst geschreven dat de service succesvol beeindigd is en daarna dat de service succesvol gestart is; ik begrijp waarom maar het is verwarrend voor een gebruiker die de log bekijkt.

Zijn er manieren om dit iets netter op te lossen of moet ik hier mee leren leven? Het gooien van een exception is een optie, maar vind ik wat lomp.

Alternatieven die ik ben tegengekomen zijn het starten van een thread (een timer thread zal toch gestart moeten worden voor de functionaliteit, dus niet veel extra werk) en daar de boel de mist in laten gaan en een exception te gooien of de service te stoppen op een of andere manier (nog niet uitgevogeld hoe maar dat doet momenteel niet zo veel terzake). Is dat de betere manier?

Bedankt voor het lezen, meedenken en de mogelijke antwoorden.

C#:
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
30
31
32
33
34
35
36
37
38
        protected override void OnStart(string[] args)
        {
            string eventsource = "ccmsgen";
            string eventlog = "ccmsgenlog";

            eventLog1.WriteEntry("starting ccmsgenerator service");

            // configuration directory and filepath
            // see http://blogs.msdn.com/b/patricka/archive/2010/03/18/where-should-i-store-my-data-and-configuration-files-if-i-target-multiple-os-versions.aspx
            string appcfgdir = System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData);

            if (args.Length == 0)
            {
                globals.configurationdirectory = appcfgdir + Path.DirectorySeparatorChar + "ccmsGenerator";
                globals.configurationfilepath = globals.configurationdirectory + Path.DirectorySeparatorChar + "ccms.cfg";
            }
            else
            {
                globals.configurationfilepath = args[0];
                globals.configurationdirectory = Path.GetDirectoryName(globals.configurationfilepath);
            }

            if (File.Exists(globals.configurationfilepath) == false)
            {
                eventLog1.Source = eventsource;
                eventLog1.Log = eventlog;
                eventLog1.WriteEntry("Could not find configuration file '" + globals.configurationfilepath + "'");
                this.Stop();

//                throw new System.IO.FileNotFoundException("Could not find configuration file '" + globals.configurationfilepath + "'");
            }
            else
            {
                eventLog1.Source = eventsource;
                eventLog1.Log = eventlog;
                eventLog1.WriteEntry("ccmsgenerator service started");
            }
        }


PS sorry voor de mix van engels en nederlands.

Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Wat was er mis met een exception gooien in een foutsituatie? Die dingen zijn daar voor bedoelt schijnt het :+
Zie ook http://stackoverflow.com/...within-the-onstart-method

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Is het niet mogelijk om dat configuratiebestand meteen mee te laten deployen tijdens de installatie?

We are shaping the future


Acties:
  • 0 Henk 'm!

  • eek
  • Registratie: Februari 2001
  • Laatst online: 06-04-2020

eek

@MagickNET

Ik zou in je onstart een losse thread starten en vanuit daar de .Stop aanroepen. Uitleg: http://stackoverflow.com/...application-from-a-thread.

Skill is when luck becomes a habit.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor het meedenken. Ik zal de gegevn links nog maar een keertje doornemen.
pedorus schreef op woensdag 27 juni 2012 @ 11:09:
Wat was er mis met een exception gooien in een foutsituatie? Die dingen zijn daar voor bedoelt schijnt het :+
Zie ook http://stackoverflow.com/...within-the-onstart-method
Zoals ik zei, ik vind dat wat lomp. Exceptions kun je gooien, dien je af te vangen en daarna kun je netjes het programma beeindigen. Maar ja, ik ben conservatief wat dat betreft en misschien zie ik het wel verkeerd.
Alex) schreef op woensdag 27 juni 2012 @ 22:05:
Is het niet mogelijk om dat configuratiebestand meteen mee te laten deployen tijdens de installatie?
Probleem is dat een gebruiker het kan verwijderen :(
eek schreef op woensdag 27 juni 2012 @ 22:43:
Ik zou in je onstart een losse thread starten en vanuit daar de .Stop aanroepen. Uitleg: http://stackoverflow.com/...application-from-a-thread.
Dat was waar ik min of meer naar verwees in de eerste post. Zal er nog eens over nadenken hoe ik het ga implementeren.

Nogmaals dank.

Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Verwijderd schreef op vrijdag 29 juni 2012 @ 15:55:
Bedankt voor het meedenken. Ik zal de gegevn links nog maar een keertje doornemen.

Probleem is dat een gebruiker het kan verwijderen :(
User error, dus exception throwen? Of Windows Installer in repair-modus starten.

We are shaping the future


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Verwijderd schreef op vrijdag 29 juni 2012 @ 15:55:
Zoals ik zei, ik vind dat wat lomp. Exceptions kun je gooien, dien je af te vangen en daarna kun je netjes het programma beeindigen. Maar ja, ik ben conservatief wat dat betreft en misschien zie ik het wel verkeerd.
Ik zou wel even MSDN: ServiceBase.ExitCode Property (System.ServiceProcess) zetten, maar voor de rest lijkt het mij niet verkeerd als een programma met een exception eindigd omdat een gebruiker bestanden heeft zitten te verwijderen. Dit gedrag is normaal en valt eigenlijk niet te voorkomen; als bepaalde dll's verwijderd worden, dan zul je zien dat (bijna) ieder .NET-programma dit doet. :p

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1