我在Windows服务中有一个计时器,并且在timer_Elapsed事件处理程序中调用了异步方法:
protected override void OnStart(string[] args)
{
timer.Start();
}
private async void timer_Elapsed(object sender, ElapsedEventArgs e)
{
_timer.Stop();
await DoSomething();
_timer.Start();
}
以上代码可以吗?首先,我读过async void不是一个好主意。其次,为什么我需要timer_Elapsed方法首先异步?它不像我们将被多个调用者并行调用的已用事件处理程序。但是,如果我不使该方法异步,那么我的逻辑将会中断,因为计时器将在DoSomething完成之前启动。
那么,正确的方法是使timer_Elapsed异步吗?
答案 0 :(得分:11)
应避免异步空白;它应该只用于事件处理程序。 Timer.Elapsed
是一个事件处理程序。所以,这里并不一定错。
timer_Elapsed
方法必须为async
,因为它包含await
。这是关键字的工作方式:async
将方法重写为异步状态机,启用await
关键字。