Запуск нескольких внутренних служб с использованием iHostedService - PullRequest
0 голосов
/ 03 октября 2018

В настоящее время мой веб-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>();

1 Ответ

0 голосов
/ 17 октября 2018

Вы можете попробовать

services.AddHostedService<DataRefreshService>;

Вы также можете попробовать сделать наследование DataRefreshService из

Microsoft.Extensions.Hosting.BackgroundService

Подробнее об этом можно прочитать здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...