【发布时间】:2014-09-20 08:58:45
【问题描述】:
我在 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 方法是异步的?它不像 elapsed 事件处理程序,我们将被多个调用者并行调用。但是,如果我不使方法异步,那么我的逻辑就会中断,因为计时器将在 DoSomething 完成之前启动。
那么,让 timer_Elapsed 异步是正确的方法吗?
【问题讨论】:
-
从异步组合的角度来看,您所拥有的一切都很好。
async void是应该避免的,但在您的情况下,您无法真正摆脱它。话虽如此,当您可以将OnStart更改为async void并且仅在循环内更改await DoSomething(); await Task.Delay(...);时,为什么还要使用计时器? -
@Kirill 感谢您的建议。在循环中使用 Task.Delay 比使用计时器更好吗?
-
就像
await一样,定时器提供了一种编写异步工作的方法。我的建议源于您已经使用一种方法(即await),那么为什么不坚持使用它而不是混合不同的组合方法呢?不过,这是非常主观的,归根结底,您应该使用自己熟悉的方法。定时器本身并没有什么“错误”。 -
@KirillShlenskiy 说得通,谢谢。
标签: c# .net asynchronous windows-services async-await