如何在定时器内调用异步任务?

29

我找到了如何使用计时器重复一个普通方法,并且它运行良好。但现在我必须在这个方法内部使用一些异步方法,所以我不得不将其改为一个任务而不是一个普通方法。这是我目前的代码:

public async Task Test()
{
    Timer t = new Timer(5000);
    t.AutoReset = true;
    t.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    t.Start();
}

private async Task OnTimedEvent(Object source, ElapsedEventArgs e)
{

}

我目前在t.Elapsed +=这行代码上遇到了一个错误,因为没有await关键字,但如果我添加上去,它会像普通函数一样运行,并给我一个缺少参数的错误。我该如何使用相同的计时器,但带有异步任务?


5
OnTimedEvent是一个事件处理程序。这是允许使用async void的一个例外情况。将该方法改为async void,并在其中等待您的异步任务。然而,Test方法不是异步的。 - Nkosi
2
请参阅其他相关问题,已经解决了这种情况的1200多个问题。链接 - Peter Duniho
1个回答

59

对于事件处理程序,您可以使用async void返回类型。您的代码应该如下所示:

public void Test()
{
    Timer t = new Timer(5000);
    t.AutoReset = true;
    t.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    t.Start();
}

private async void OnTimedEvent(Object source, ElapsedEventArgs e)
{

}

顺便提一下,这里有一个小错误,因为委托函数ElapsedEventHandler实际上是这样的: public delegate void ElapsedEventHandler(object? sender, ElapsedEventArgs e);所以你应该将你的OnTimedEvent更改为: OnTimedEvent(object? sender, ElapsedEventArgs e) - nights
这个计时器使用的是哪个定时器?请指定此定时器的命名空间。 - Zapnologica
看到签名@zapnologica,我会期望是System.Timers.Timer。 - Brett Styles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接