BackgroundService 中具有动态周期的PeriodicTimer

问题描述 投票:0回答:2

我正在使用

using PeriodicTimer timer = new(_period);

while (!stoppingToken.IsCancellationRequested
    && await timer.WaitForNextTickAsync(stoppingToken))
{
    await DoWork();
}

有没有办法动态设置

_period
?也就是说,以数据库的那一段时间为例。

c# .net-6.0 background-service .net-7.0 periodictimer
2个回答
3
投票

.NET 8 上引入了新属性

PeriodicTimer.Period

获取或设置刻度之间的周期。

最初这个答案包含一个自定义的

UpdateablePeriodicTimer
实现,具有(当时缺少)
Period
属性。如果您的目标是 .NET 6 或 7,您可以在本答案的第 1 版中找到它。不过,我对这个实现不再满意,因为当我编写它时,我没有意识到 PeriodicTimer 类的
by design
行为:

这是设计使然。计时器在创建实例时启动,而不是在您调用

WaitForNextTickAsync
时启动。如果计时器在调用之前计时,它将立即完成。即使它不是第一次,也是如此,例如,如果您调用 Wait 并且它完成,那么您离开的时间超过该时间段,下一次调用 Wait 也可能会立即完成。


3
投票

不可以,

Periodic Timer
不允许在实例化后更改
period

您可以使用从其他地方获得的值构造原始或新的不同

Periodic Timer
,但请确保
Dispose
实例,以便可以释放所需的资源。

如果您需要可变延迟,可以使用

Task.Delay
代替。

© www.soinside.com 2019 - 2024. All rights reserved.