【发布时间】: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