【发布时间】:2019-11-27 20:24:17
【问题描述】:
我正在使用 System.Threading.Timer 运行一些 async 的东西
这意味着我的回调是async void。
private async void CallbackAsync(object state) {
_timer.Change(Timeout.Infinite, Timeout.Infinite);
await SomethingAsync();
_timer.Change(TimeToNextCallback, Timeout.Inifinite);
}
对于非异步回调,我使用了这样的代码来安全地关闭计时器。
using (var waitHandle = new AutoResetEvent(false)) {
if (_timer.Dispose(waitHandle)) {
waitHandle.WaitOne();
}
}
我的理解是这不适用于异步回调。回调将在第一个 await 上返回,并且 Timer 不知道预定的延续。即上面的代码可能会在延续完成之前返回(并且回调可能会尝试更改已处置的计时器)。
首先,我的理解正确吗?
其次,等待异步回调完成的正确方法是什么?
【问题讨论】:
-
标准 cancel task 似乎是一条可能的路线...而且我会完全放弃计时器,只需
await Task.Delay(canelationToken)... -
你能描述一下你想通过使用计时器来实现什么吗?
-
抱歉,回复晚了。计时器是我正在尝试更新以支持异步回调的旧代码。
标签: c# timer async-await