В настоящее время мой веб-API может работать по расписанию и запускать другую конечную точку для синхронизации данных.Службы, которые необходимо вызвать, хранятся в файле yml.Мне удалось заставить его работать на одну службу для запуска расписания.Я хочу сохранить несколько конечных точек с собственными расписаниями, чтобы их можно было запланировать и выполнить в нужное время.
Вот код, который у меня сейчас есть
Я сделал это с помощью интерфейса iHostedService.
Это класс HostService, который реализует iHostedService
public abstract class HostedService : IHostedService
{
private Task _executingTask;
private CancellationTokenSource _cts;
public Task StartAsync(CancellationToken cancellationToken)
{
_cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
_executingTask = ExecuteAsync(_cts.Token);
// If the task is completed then return it, otherwise it's running
return _executingTask.IsCompleted ? _executingTask : Task.CompletedTask;
}
public async Task StopAsync(CancellationToken cancellationToken)
{
// Stop called without start
if (_executingTask == null)
{
return;
}
// Signal cancel
_cts.Cancel();
// Wait until the task completes or the stop token triggers
await Task.WhenAny(_executingTask, Task.Delay(-1, cancellationToken));
cancellationToken.ThrowIfCancellationRequested();
}
// cancel
protected abstract Task ExecuteAsync(CancellationToken cancellationToken);
}
Затем я расширяю этот класс и реализую то, что необходимо сделать в ExecuteAsync
следующим образом
public class DataRefreshService : HostedService
{
private readonly DataFetchService _dataFetchService;
public DataRefreshService(DataFetchService randomStringProvider)
{
_dataFetchService = randomStringProvider;
}
protected override async Task ExecuteAsync(CancellationToken cancellationToken)
{
try
{
while (!cancellationToken.IsCancellationRequested)
{
await _dataFetchService.UpdateData(cancellationToken);
TimeSpan span = _dataFetchService.GetNextTrigger();
await Task.Delay(span, cancellationToken);
}
} catch (Exception)
{
await StopAsync(cancellationToken);
throw new Exception("Error trigger Sync service");
}
}
}
Это то, что я добавил в файл Startup.cs
services.AddSingleton<DataFetchService>();
services.AddSingleton<IHostedService, DataRefreshService>();