比如下面的代码,不想在同步方法直接调用异步方法,请问如何在 Timer 的 callback 以 await 方式调用异步方法?
public sealed class RedisCheckHostedService(IRedisDatabase redisDatabase) : IHostedService, IDisposable
{
private Timer? _timer = null;
public Task StartAsync(CancellationToken stoppingToken)
{
_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(30));
return Task.CompletedTask;
}
private void DoWork(object? state)
{
redisDatabase.Database.StringGetAsync("RedisCheck");
}
// ...
}
通过 PeriodicTimer
解决了
public sealed class RedisCheckHostedService(IRedisDatabase redisDatabase) : IHostedService, IDisposable
{
private PeriodicTimer? _timer = null;
public async Task StartAsync(CancellationToken stoppingToken)
{
_timer = new PeriodicTimer(TimeSpan.FromSeconds(30));
_ = Task.Run(DoWorkAsync());
}
private async Task DoWorkAsync()
{
while (await _timer.WaitForNextTickAsync(stoppingToken))
{
await redisDatabase.Database.StringGetAsync("RedisCheck");
}
}
// ...
}
方法来自: