我在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;
..............
}
答案 0 :(得分:0)
您正在从同步方法调用异步方法,因此如果异步方法抛出任何异常,则同步方法不会捕获它,因为异步方法线程上下文不会合并到您的同步调用。 通常,使用异步void方法会更难测试程序 - 但是为入口点事件处理程序准确地给出了这种能力。
你现在可以做什么: 1.更改WriteLog方法,如下所示
private async Task WriteLog(WorkerLog worker)
此外,从
等同步方法调用此WriteLog方法 Task.Run(async () => { await WriteLog(worker); });