如何在具有不同计时器持续时间的.net Core中的后台服务中运行多个任务 [英] How to run multiple task in background service in .net core with different timer duration
问题描述
我正在创建一个工作程序服务,它将作为Windows服务运行.我有一个要求,我想调用两个可能具有不同计时器的任务.
I am creating a worker service which will be run as a windows service. I have a requirement where I would like to invoke two tasks which may have different timers.
说 DoWork
应该每5分钟调用一次,而 DoAnotherWork
应该每10分钟调用一次.这两个任务可以并行运行,并且彼此不依赖.
Say DoWork
should be called every 5 minutes and DoAnotherWork
should be called every 10 minutes or so. These two tasks can run in parallel and are not dependant on each other.
我能够创建任务 DoWork
,该任务每5分钟运行一次.我对如何执行另一个具有不同计时器持续时间的任务感到困惑?
I was able to create task DoWork
which can run after every 5 minutes. I am a bit confused about how to implement another task that will have different timer duration?
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();
}
}
推荐答案
这两个任务可以并行运行,并且彼此不依赖.
These two tasks can run in parallel and are not dependant on each other.
给我的声音就像您有两项服务一样:
Sounds to me like you have two services:
public class ProcessDataLoaderWorker : BackgroundService
{
private readonly IServiceScopeFactory _scopeFactory;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
using var scope = _scopeFactory.CreateScope();
var dataLoaderService = scope.ServiceProvider.GetRequiredService<IDataLoaderService>();
while (true)
{
await dataLoaderService.Process();
await Task.Delay(TimeSpan.FromMinutes(5), stoppingToken); //Run every 5 minutes
}
}
}
public class ValidateDataLoaderWorker : BackgroundService
{
private readonly IServiceScopeFactory _scopeFactory;
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
using var scope = _scopeFactory.CreateScope();
var dataLoaderService = scope.ServiceProvider.GetRequiredService<IDataLoaderService>();
while (true)
{
await dataLoaderService.Validate();
await Task.Delay(TimeSpan.FromMinutes(10), stoppingToken); //Run every 10 minutes
}
}
}
我还修改了 IDataLoaderService
的使用方式,以便不在其范围内使用它,并更改了 Task.Delay
参数,使其更加不言自明.
I also modified the way the IDataLoaderService
was used so that it is not used outside its scope, and changed the Task.Delay
arguments to be more self-explanatory.
这篇关于如何在具有不同计时器持续时间的.net Core中的后台服务中运行多个任务的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!