【问题标题】:Task in C# windows service does not log when elapsed by timerC# Windows 服务中的任务在计时器经过时不记录
【发布时间】:2018-10-02 13:15:07
【问题描述】:

我用 C# 编写了一个 Windows 服务,我在其中调用了 asynchrnous OnStart()、OnStop() 处的任务和计时器滴答的经过回调 每 30 秒。任务如下所示:

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

我面临的问题是我可以看到我的记录器在调用 OnStart 时正在记录。但是计时器经过的回调没有记录。此外,当我从服务资源管理器停止服务时,它也会记录。我已经在没有这个异步调用的情况下测试了服务,它会在每个滴答和 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;

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

【问题讨论】:

  • 它看起来是几件事的组合。您没有在等待 WriteLog,因此计时器处理程序可能会在记录器启动之前拆除一个线程。其次,您的 async void 会吞下异常。尝试异步任务。

标签: c# windows service async-await task


【解决方案1】:

您正在从同步方法调用异步方法,因此如果异步方法抛出任何异常,那么同步方法将不会捕获它,因为异步方法线程上下文不会合并到您的同步调用中。 一般来说,使用 async void 方法会使程序更难测试 - 但正是为入口点事件处理程序提供了这种能力。

你现在可以做什么: 1.改变WriteLog方法如下

private async Task WriteLog(WorkerLog worker)

另外,从同步方法中调用此 WriteLog 方法,如

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

【讨论】:

  • Task.Run 不需要
  • 嗨 Crowcoder ,那么应该叫什么更实用? WriteLog(worker).GetAwaiter().GetResult() 导致应用程序正在使用计时器。这不会让服务应用程序从资源管理器中停止。说它正在使用中。如果我像在上面的帖子中使用的那样使用 await 它,它可以停止而不会出错。
  • 嗨 Crowcoder,您是在建议更好的方法还是 user1672994 建议的方法不正确?
  • 与其编写 WriteLog(worker).GetAwaiter().GetResult()WriteLog(worker).Wait() 之类的代码,Task.Run 是作为委托提供操作的更好选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
  • 1970-01-01
相关资源
最近更新 更多