我正在使用
using PeriodicTimer timer = new(_period);
while (!stoppingToken.IsCancellationRequested
&& await timer.WaitForNextTickAsync(stoppingToken))
{
await DoWork();
}
有没有办法动态设置
_period
?也就是说,以数据库的那一段时间为例。
PeriodicTimer.Period
:
获取或设置刻度之间的周期。
最初这个答案包含一个自定义的
UpdateablePeriodicTimer
实现,具有(当时缺少) Period
属性。如果您的目标是 .NET 6 或 7,您可以在本答案的第 1 版中找到它。不过,我对这个实现不再满意,因为当我编写它时,我没有意识到 PeriodicTimer
类的 by design行为:
这是设计使然。计时器在创建实例时启动,而不是在您调用
时启动。如果计时器在调用之前计时,它将立即完成。即使它不是第一次,也是如此,例如,如果您调用 Wait 并且它完成,那么您离开的时间超过该时间段,下一次调用 Wait 也可能会立即完成。WaitForNextTickAsync
Periodic Timer
不允许在实例化后更改period
。
您可以使用从其他地方获得的值构造原始或新的不同
Periodic Timer
,但请确保 Dispose
实例,以便可以释放所需的资源。
Task.Delay
代替。