Opgave i C # windows service logger ikke, når den er forløbet med timer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har skrevet en windows service i C # hvor jeg kaldte en asynkrone
Opgave ved OnStart (), OnStop () og en tilbagekaldt tilbagekaldelse af en timerflik
hvert 30. sekund. Opgaven ser ud som følger:


    private async void WriteLog(WorkerLog worker)
    {
        string x = await Logger.WriteLogAsync(worker);
        Logger.WriteError(x);
    }


Problemet jeg står over for er, at jeg kan se, min logger logger, når OnStart hedder. Men timer tilbagekaldt tilbagekald logger ikke. Også når jeg stopper tjenesten fra serviceforsker, logger den heller ikke. Jeg har testet tjenesten uden denne async-opkald, det logger i hvert kryds og OnStop ().


Kan nogen pin point min tanke hvad skal jeg overveje, før du ringer async opkald i windows service timer tikkekald?


For at tage en idé om, hvordan min forløbne timer ticker ligner:


    private void workerTimer\_Tick(object sender, ElapsedEventArgs e)
    {
        // Write code here to do some job depends on your requirement
        worker.Message = "Scheduler timer ticked and some job has been done successfully.";
        WriteLog(worker);
    }


Timeren oprettet ved OnStart ()


    protected override void OnStart(string[] args)
    {
        workerTimer = new System.Timers.Timer();
        this.workerTimer.Interval = 30000; // every 30 secs
        this.workerTimer.Elapsed += new System.Timers.ElapsedEventHandler(this.workerTimer\_Tick);
        this.workerTimer.Enabled = true;
        this.workerTimer.AutoReset = false;

        ..............
    }

Bedste reference


Du anvender async-metode fra synkron metode, så hvis der er nogen undtagelse kastet af async-metode, vil den ikke blive fanget ved synkron metode, da async-metode trådkontekst ikke vil fusionere til dit synkronke opkald.
Generelt har async void metoder vanskeligere at teste programmet - men evnen blev netop givet til entry point event handlers.


Hvad du kan gøre nu:
1. Skift WriteLog-metoden som nedenfor


private async Task WriteLog(WorkerLog worker)


Også påberåbe denne WriteLog metode fra synkron metode som


 Task.Run(async () => { await WriteLog(worker); });