【发布时间】:2020-07-24 16:00:58
【问题描述】:
我正在创建一个工作服务,它将作为 Windows 服务运行。我有一个需求,我想调用两个可能有不同计时器的任务。
说DoWork 应该每 5 分钟调用一次,DoAnotherWork 应该每 10 分钟左右调用一次。这两个任务可以并行运行,互不依赖。
我能够创建每 5 分钟运行一次的任务 DoWork。我对如何实现另一个具有不同计时器持续时间的任务感到有些困惑?
public class Worker : BackgroundService
{
private readonly IServiceScopeFactory _scopeFactory;
private IDataLoaderService _dataLoaderService;
public override Task StartAsync(CancellationToken cancellationToken)
{
using var scope = _scopeFactory.CreateScope();
_dataLoaderService = scope.ServiceProvider.GetRequiredService<IDataLoaderService>();
return base.StartAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
await DoWork(stoppingToken, _dataLoaderService);
await Task.Delay(300000, stoppingToken); //Run every 5 minutes
await DoAnotherWork(stoppingToken, _dataLoaderService);
await Task.Delay(600000, stoppingToken); //Run every 10 minutes
}
}
private async Task DoWork(CancellationToken stoppingToken, IDataLoaderService loaderService)
{
await loaderService.Process();
}
private async Task DoAnotherWork(CancellationToken stoppingToken, IDataLoaderService loaderService)
{
await loaderService.Validate();
}
}
【问题讨论】:
-
如果您不想使用 Hangfire 或 Quartz,您可以使用其中一个计时器(用于 example)。
-
@GuruStron 你能详细说明我如何在
ExecuteAsync或StartAsync方法中使用Timer吗?
标签: c# .net-core asp.net-core-hosted-services