C # windows service program

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg var i stand til at oprette en simpel Windows Service App. bare rammen. men jeg er stadig forvirret. hvor skal jeg sætte min kode til windows service til faktisk at gøre noget. Jeg har et særskilt program, som jeg gerne vil medtage/ringe/inkorporere her.
hvor skal programmet stå? hvor skal jeg starte?


public partial class MyNewService : ServiceBase
{
    public MyNewService()
    {
        InitializeComponent();
        if (!System.Diagnostics.EventLog.SourceExists("MySource"))
        {
            System.Diagnostics.EventLog.CreateEventSource(
                "MySource", "MyNewLog");
        }
        eventLog1.Source = "MySource";
        eventLog1.Log = "MyNewLog";
    }




    static void Main()
    {
        System.ServiceProcess.ServiceBase[] ServicesToRun;
        // Change the following line to match.
        ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() };
        System.ServiceProcess.ServiceBase.Run(ServicesToRun);
    }
}


}

Bedste reference


Du skal tilsidesætte OnStart-metoden (og andre lignende, som f.eks. OnStop, OnShutdown osv.). [14]


Når du gør dette, skal du sørge for, at din OnStart metode ikke blokerer eller tager meget lang tid at udføre. Dette betyder ofte, at du kører din faktiske service logik i sin egen tråd.

Andre referencer 1


I dette gennemgang står det at du tilsidesætter OnStart(). [15]


Hvis du ikke er bundet til at bruge den Windows Service-programskabelon, kan du måske tjekke dette bibliotek, hvilket gør programmeringstjenester meget lettere. I øjeblikket kan du ikke køre den udførte servicekomponent direkte - den kan kun installeres . Hoytsofts bibliotek installeres og kører derefter automatisk det til dig efter, ligesom en normal Windows Form-applikation. [16]

Andre referencer 2


Overstyr følgende metoder på din MyNewService efter behov:


protected virtual void OnContinue();
protected virtual void OnCustomCommand(int command);
protected virtual void OnPause();
protected virtual bool OnPowerEvent(PowerBroadcastStatus powerStatus);
protected virtual void OnSessionChange(SessionChangeDescription changeDescription);
protected virtual void OnShutdown();
protected virtual void OnStart(string[] args);

Andre referencer 3


Du reagerer på de forskellige begivenheder, der sendes ved hjælp af On\_\_\_\_ metoderne (de er virtuelle, så du kan tilsidesætte dem).


Specielt i det enkleste tilfælde:


protected override void OnStart(string[] args)
{
    //Do stuff here
}

Andre referencer 4


Du skal tilsidesætte funktionen OnStart(). Jeg foreslår at flytte al den kode, du i øjeblikket har i konstruktøren i samme funktion, da det anbefales at lade konstruktøren være tom (dette er ikke kun for tjenester, men det er en anden historie). I starten spinner du normalt en eller flere tråd, der gør det job, du ønsker. Husk OnStart () skal returnere så langt som muligt. Du skal sandsynligvis også implementere nogle logik i funktionen OnStop () for at kunne blæse arbejdstråderne elegant.

Andre referencer 5


Som sagt, skal du ikke sætte din kode i OnStart (). Hvorfor? Fordi hvis din OnStart () -metode ikke kommer hurtigt tilbage, vil servicechefen markere din tjeneste som uresponsiv og lukke dig ned.


Så jeg sætter min kode i en Start () metode, og alle OnStart () gør er kald Start (). Ligesom:


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

    public static void Start()
    {
       ... do stuff
    }


Vær også opmærksom på, at din kode for at starte tjenesten skal fungere anderledes afhængigt af om du er i kompilering eller debug-tilstand.


System.ServiceProcess.ServiceBase[] ServicesToRun; // Change the following line to match. ServicesToRun = new System.ServiceProcess.ServiceBase[] { new MyNewService() }; System.ServiceProcess.ServiceBase.Run(ServicesToRun);


Jeg gør dette for at sikre, at den opfører sig korrekt, og jeg behøver ikke at huske at ændre koden frem og tilbage for at køre eller fejle.


        if(Debugger.IsAttached)
            Service.Start();
        else
        {
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
            { 
                new Service() 
            };

            ServiceBase.Run(ServicesToRun);
        }

Andre referencer 6


Overstyr OnStart () Metoden for at få din virksomhedslogik påberåbt. Som tidligere nævnt kan du enten oprette en anden tråd for at få funktionaliteten eller bruge Eventhandlers med Timers (ved hjælp af threading igen) for at få den logiske logik påberåbt. Tjenesten skal returnere kontrol til operativsystemet, og derfor skal startstartmetoden returnere kontrollen til windows, mens tjenesten kører.


For at styre, Pause, Genoptag, Strømlukning, På Stop-begivenheder, skal du tilsidesætte disse metoder og skrive din logik der.