.net - C # Windows Service - Startet og stoppet derefter automatisk

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg opretter denne windows service ved at følge vejledningen på MSDN Walkthrough: Oprettelse af en Windows Service og efter en vellykket installation går jeg til Services.msc for at starte Windows-tjenesten, og inden den afsluttes starter jeg følgende meddelelse: [5]]]



  EIWindowsService-tjenesten på lokal computer startede og stoppede derefter. Nogle tjenester stopper automatisk, hvis de ikke bruges af andre tjenester eller programmer.



Jeg ved, at Windows-tjenesten starter ok, fordi der er en adgang til logfilen, der angiver, at tjenesten startede. Jeg har foretaget en del undersøgelser inden udstationering her, og svaret fra nogle tjenester Stop Står automatisk, at problemet enten kunne være, at OnStart-metoden kaster en fejl, eller at OnStart ikke starter en tråd. Så jeg ændrede min kode, så det eneste i OnStart er starten på to timere, og logindgangen behøver derfor ingen undtagelse. Jeg har også tilføjet en tråd til at 'hoppe' til en anden metode.


Jeg prøvede Windows-tjenesten igen, og jeg ved, at den 'flyttede' til den nye metode, som tråden pegede på, fordi jeg havde en logboggang derinde, der smed aFormatException-fejl på grund af en vis konvertering, jeg gjorde. Jeg kommenterede konverteringen, og windows-tjenesten begyndte lige lige at starte op og stoppede derefter automatisk.


Yderligere undersøgelse viste mig, at jeg måske har brug for en sløjfe for at holde behandlingen inden for metoden, så jeg tog information fra C - Windows Service til service og satte op en uendelig mellemgang. Jeg fandt også, at der kunne være Garbage Collection på gang og etableret en KeepAlive erklæring for timere som foreslået i eksempler af MSDN Timer Class. Stadig de samme problemer. [8]


På dette tidspunkt føler jeg, at jeg har udforsket al den forskning, jeg kan gøre, så det ville være hensigtsmæssigt at sende mit spørgsmål her. Al min kode er nedenfor, og jeg vil bemærke, at før jeg udførte en ændring, afinstallerede jeg Windows Service, fjernede Setup Projekt og slettet installatørerne fra C # -koden. Jeg lavede derefter ændringer og startede igen med instruktionerne i Walkthrough, der starter ved det punkt, hvor den instruerer, hvordan man installerer installatørerne. Jeg gjorde det hver gang fordi jeg fandt det, hvis jeg lavede ændrer og afinstallerede ikke Windows-tjenesten, fjerner installationsprojektet og sletter installationsprogrammerne, så vil mine ændringer ikke træde i kraft på den installerede Windows-tjeneste.


Enhver hjælp, du kan give, vil blive bedst værdsat. Jeg vil være her i endnu 15 minutter og så vil jeg tjekke denne første ting i morgen.


SERVICE1.cs


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;

namespace EIWindowsService
{
    public partial class Service1 : ServiceBase
    {
        Logs.ErrorLog logFile = new Logs.ErrorLog();
        private System.Threading.Thread onStartThread;

        public Service1()
        {
            InitializeComponent();            
        }

        protected override void OnStart(string[] args)
        {
            try
            {
                iTimer.Start();
                iTimer.Elapsed += new ElapsedEventHandler(iTimer\_Elapsed);
                pTimer.Start();
                pTimer.Elapsed += new ElapsedEventHandler(pTimer\_Elapsed);                
                onStartThread = new System.Threading.Thread(TimerValue);
                onStartThread.Start();
                logFile.SendToLog("EIWindows Service started on " + GetDate());
            }
            catch (ArgumentOutOfRangeException ex)
            {
                logFile.SendToLog("ArgumentOutOfRangeException", "EIWindowsService\Service1.cs", "OnStart()", ex);
            } //end of ArgumentOutOfRangeException CATCH statement
        }

        protected override void OnStop()
        {
            iTimer.Stop();
            pTimer.Stop();
            logFile.SendToLog("EIWindowsService\Service1.cs", "OnStop()", "EIWindows Service stopped on " + GetDate());

        }

        private void TimerValue()
        {
            try
            {
                   /*commented out because it was throwing an exception error*/
                   //double iTimerValue = Convert.ToDouble(iTimer.ToString());
                   //double pTimerValue = Convert.ToDouble(pTimer.ToString());
                while (1 > 0)
                {
                       //if (iTimerValue \% 1800000 == 0)  //if the timer hits the 30min mark
                       //{
                       //    logFile.SendToLog("Current iTimer Value = " + iTimerValue.ToString());
                       //}
                       //if (pTimerValue \% 1800000 == 0)  //if the timer hits the 30min mark
                       //{
                       //    logFile.SendToLog("Current pTimer Value = " + pTimerValue.ToString());
                       //}
                    GC.KeepAlive(iTimer);
                    GC.KeepAlive(pTimer);
                }
                   //TimerValue();
            }
            catch (OverflowException ex)
            {
                logFile.SendToLog("OverflowException", "EIWindowsService\Service1.cs", "TimerValue()", ex);
            } //end of OverflowException CATCH statement
            catch (ArgumentException ex)
            {
                logFile.SendToLog("ArgumentException", "EIWindowsService\Service1.cs", "TimerValue()", ex);
            } //end of ArgumentException CATCH statement
            catch (FormatException ex)
            {
                logFile.SendToLog("FormatException", "EIWindowsService\Service1.cs", "TimerValue()", ex);
            } //end of FormatException CATCH statement
        }

        private string GetDate()
        {
            string current = "No Date Recorded";
            try
            {
                current = DateTime.Now.ToString("F");
            }
            catch (FormatException ex)
            {
                logFile.SendToLog("FormatException", "EIWindowsService\Service1.cs", "GetDate()", ex);
            } //end of FormatException CATCH statement

            return current;
        } //end of method GetDate

        private void iTimer\_Elapsed(object source, ElapsedEventArgs e)
        {
            try
            {
                iTimer.Stop();
                ImportI();
                iTimer.Start();
            }
            catch (ArgumentOutOfRangeException ex)
            {
                logFile.SendToLog("ArgumentOutOfRangeException", "EIWindowsService\Service1.cs", "iTimer\_Elapsed()", ex);
            } //end of ArgumentOutOfRangeException CATCH statement
        } //end of method iTimer\_Elapsed

        private void pTimer\_Elapsed(object source, ElapsedEventArgs e)
        {
            try
            {
                pTimer.Stop();
                ImportP();
                pTimer.Start();
            }
            catch (ArgumentOutOfRangeException ex)
            {
                logFile.SendToLog("ArgumentOutOfRangeException", "EIWindowsService\Service1.cs", "pTimer\_Elapsed()", ex);
            } //end of ArgumentOutOfRangeException CATCH statement
        } //end of method pTimer\_Elapsed

        private void ImportI()
        {
            //does some action but commented out because it never gets here and is not relavant to this question.
        } //end of method ImportI

        private void ImportP()
        {
            //does some action but commented out because it never gets here and is not relavant to this question.
        } //end of method ImportP
    }
}


SERVICE1.DESIGNER.CS (de relavante ting)


private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.pTimer = new System.Timers.Timer(10800000);  //3hrs
            this.iTimer = new System.Timers.Timer(3600000);  //1hr
            // 
            // pTimer
            // 
            this.pTimer.Enabled = true;
            // 
            // iTimer
            // 
            this.iTimer.Enabled = true;
            // 
            // Service1
            // 
            this.ServiceName = "EIWindowsService";

        }

        #endregion

        private System.Timers.Timer pTimer;
        private System.Timers.Timer iTimer;

Bedste reference


Du behøver ikke at oprette en separat tråd eller bekymre dig om skraldespanden. Rammen håndterer alt det for dig. Bare lav timerne, og de bliver kaldt. Her er et eksempel.


public partial class Service1 : ServiceBase
{
    private Timer timer;

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        timer = new Timer(1000);
        timer.Elapsed += new ElapsedEventHandler(timer\_Elapsed);
        timer.Start();
    }

    void timer\_Elapsed(object sender, ElapsedEventArgs e)
    {
        using (StreamWriter writer = File.AppendText(@"C:UsersalfonsoDesktoplog.txt"))
        {
            writer.WriteLine(string.Format("{0} : {1}", DateTime.Now, "Logging from the service"));
        }
    }

    protected override void OnStop()
    {
    }
}

Andre referencer 1


Noget andet der kan hjælpe nogen der kommer på tværs af dette indlæg og ovenstående løsninger virker ikke. Da jeg havde dette problem, havde jeg tilføjet dette til konfigurationen af ​​min Windows Service:


<system.web>
    <compilation debug ="true" />    
</system.web>


Jeg tilføjede dette, så jeg kunne vedhæfte debuggeren til tjenesten, når den kørte den lokalt, men da jeg forsøgte at flytte tjenesten til en anden server, gav den den angivne fejl. Ved at fjerne dette fra konfigurationen fungerede tjenesten igen.