C #windows服务中的任务不会在计时器过去时记录

时间:2018-04-22 10:43:37

标签: c# windows service async-await task

我在C#中编写了一个Windows服务,在那里我称之为asynchrnous OnStart(),OnStop()上的任务和计时器的经过回调滴答 每30秒一次。任务如下所示:

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

我面临的问题是,当调用OnStart时,我可以看到我的记录器正在记录。但是计时器已过去的回调没有记录。此外,当我从服务资源管理器停止服务时,它也会记录日志。我已经测试了服务,没有在每个tick和OnStop()中记录的异步调用。

在Windows服务计时器刻度调用中调用异步调用之前,任何人都可以指出我的想法吗?

了解我的流逝计时器自动收报机是什么样的:

    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);
    }

在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;

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

1 个答案:

答案 0 :(得分:0)

您正在从同步方法调用异步方法,因此如果异步方法抛出任何异常,则同步方法不会捕获它,因为异步方法线程上下文不会合并到您的同步调用。 通常,使用异步void方法会更难测试程序 - 但是为入口点事件处理程序准确地给出了这种能力。

你现在可以做什么: 1.更改WriteLog方法,如下所示

private async Task WriteLog(WorkerLog worker)

此外,从

等同步方法调用此WriteLog方法
 Task.Run(async () => { await WriteLog(worker); });