首页 新闻 会员 周边 捐助

C# 中如何在 Timer 的 callback 中调用异步方法

0
悬赏园豆:30 [已解决问题] 解决于 2025-06-08 17:21

比如下面的代码,不想在同步方法直接调用异步方法,请问如何在 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");
    }
    
    // ...
}
dudu的主页 dudu | 高人七级 | 园豆:24691
提问于:2025-06-08 16:43
< >
分享
最佳答案
0

通过 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");
        }        
    }
    
    // ...
}

方法来自:

dudu | 高人七级 |园豆:24691 | 2025-06-08 17:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册