在Windows服务中的timer_elapsed事件处理程序中使用async等待

Pra*_*bhu 9 .net c# asynchronous windows-services async-await

我在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();
}
Run Code Online (Sandbox Code Playgroud)

上面的代码好吗?首先,我读过async void不是一个好主意.其次,为什么我需要timer_Elapsed方法首先异步?它不像我们将由多个调用者并行调用的已用事件处理程序.但是,如果我不使方法异步,那么我的逻辑将会中断,因为计时器将在DoSomething完成之前启动.

那么,正确的方法是使timer_Elapsed异步吗?

Ste*_*ary 12

应该避免异步空白; 它应该只用于事件处理程序.Timer.Elapsed是一个事件处理程序.所以,这不一定是错的.

timer_Elapsed方法必须是async因为它包含一个await.这是关键字的工作方式:async将方法重写为异步状态机,启用await关键字.