c# - C# 中的 IHostedService 不会每次都触发方法吗?

标签 c# asp.net-core asp.net-core-hosted-services

这是我在 .net core 5 中的代码,它希望每 2 分钟触发一个函数。我不知道为什么 LoadData 函数在 2 分钟后没有触发,只有第一次触发?

public Task StartAsync(CancellationToken stoppingToken)
{
    var _timer = new System.Threading.Timer(LoadData, null, TimeSpan.Zero, TimeSpan.FromMinutes(2));

    return Task.CompletedTask;
}

private async void LoadData(object state)
{
   var res = await _repository.GetAsync();
   //....
}

最佳答案

以下行:

var _timer = new System.Threading.Timer(LoadData, null, TimeSpan.Zero, TimeSpan.FromMinutes(2));

将创建一个计时器并将引用仅保存到局部变量,从而允许 GC 收集System.Threading.Timer。解决方法可以是引入一个字段:

System.Threading.Timer _timer;

public Task StartAsync(CancellationToken stoppingToken)
{
    _timer = new System.Threading.Timer(LoadData, null, TimeSpan.Zero, TimeSpan.FromMinutes(2));

    return Task.CompletedTask;
}

切换到 System.Timers.Timer 也可以工作(但尚未测试)。

另请参阅:

关于c# - C# 中的 IHostedService 不会每次都触发方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76905468/

相关文章:

c# - 有没有办法构造一个正则表达式来排除高于或低于某个值的 ASCII 字符?

c# - ASP.NET Core 相当于 ASP.NET MVC 5 的 HttpException

c# - 在 ASP.net 5 MVC 6 中,如何在不同的命名空间中使用相同的 Controller 名称

c# - .net 核心依赖注入(inject)到托管服务

c# - 如何为控制台应用程序设置 ASPNETCORE_ENVIRONMENT?

c# - 如何覆盖 Autofac 子范围中的 Serilog 记录器?

javascript - 为什么单选按钮没有传递 asp 控件的 clientID

c# - 设置N位数可以表示多少个Int32数?

c# - 从 aspnet5 引用 "old".NET 4.x DLL?

c# - 命名空间 'OData' 中不存在类型或命名空间 'Microsoft.AspNetCore'