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

时间:2014-07-29 03:08:31

标签: c# .net 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();
}

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

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

1 个答案:

答案 0 :(得分:11)

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

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