Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在windows服务中的计时器事件处理程序中使用异步等待_C#_.net_Asynchronous_Windows Services_Async Await - Fatal编程技术网

C# 在windows服务中的计时器事件处理程序中使用异步等待

C# 在windows服务中的计时器事件处理程序中使用异步等待,c#,.net,asynchronous,windows-services,async-await,C#,.net,Asynchronous,Windows Services,Async Await,我在Windows服务中有一个计时器,并且在timer\u事件处理程序中调用了一个异步方法: protected override void OnStart(string[] args) { timer.Start(); } private async void timer_Elapsed(object sender, ElapsedEventArgs e) { _timer.Stop(); await DoSomething();

我在Windows服务中有一个计时器,并且在timer\u事件处理程序中调用了一个异步方法:

protected override void OnStart(string[] args)
{
     timer.Start();    
}  

private async void timer_Elapsed(object sender, ElapsedEventArgs e)
{
    _timer.Stop();
    await DoSomething();          
    _timer.Start();
}
上面的代码行吗?首先,我读到异步void不是一个好主意。其次,为什么我首先需要timer_appeased方法是异步的?它不像经过的事件处理程序那样会被多个调用者并行调用。然而,如果我不使方法异步,那么我的逻辑将中断,因为计时器将在DoSomething完成之前启动


那么,让计时器异步运行是正确的方法吗?

应该避免异步无效;它应仅用于事件处理程序<代码>计时器。已用是一个事件处理程序。所以,这不一定是错的


timer\u expead
方法必须是
async
,因为它包含一个
wait
。关键字的工作方式如下:
async
将方法重写为异步状态机,从而启用
wait
关键字。

谢谢@Stephen。有趣的是,就在今天早上,我从你的博客中了解到了async/Wait,写得很棒!我还想知道如何在递归方法中正确使用async/Wait:@Maxim:恐怕我不理解你的评论。也许你应该问你自己的问题?有两个计时器:System.timers.Timer和System.Threading.Timer。据我所知,第一个事件已经过去,可以使用异步事件处理程序。第二个接受回调作为构造函数中的参数。那个定时器呢?那个回调也可以是异步无效的吗?@Maxim:当然,它在逻辑上是一个事件处理程序。从异步组合的角度来看,您所拥有的一切都是好的
async void
是应该避免的,但在您的场景中,您无法真正摆脱它。话虽如此,当您可以将
OnStart
更改为
async void
并等待DoSomething()时,为什么还要首先使用计时器呢;等待任务。延迟(…)在循环中?@Kirill谢谢你的建议。在循环中使用Task.Delay比使用计时器更好吗?就像
wait
一样,计时器提供了一种编写异步工作的方法。我的建议源于这样一个事实,即您已经在使用一种方法(即
wait
),那么为什么不在所有方面都坚持使用它,而不是混合使用不同的合成方法呢?这是非常主观的,但在一天结束时,你应该使用你感到舒服的方法。计时器本身并没有什么天生的“错误”。@KirillShlenskiy说得通,谢谢。