Запустите запуск экземпляра размещенной службы в области. net приложение основной консоли - PullRequest
0 голосов
/ 10 апреля 2020

Каков наилучший способ запуска нескольких размещенных служб в основном приложении. net? Количество размещенных служб будет меняться во время выполнения, и при запуске нового экземпляра размещенной службы требуется параметр. Я хотел бы реализовать их как размещенные сервисы:

internal interface IScopedProcessingService
{
    Task DoWork(CancellationToken stoppingToken);
}

internal class ScopedProcessingService : IScopedProcessingService
{
    private int executionCount = 0;
    private readonly ILogger _logger;

    public ScopedProcessingService(ILogger<ScopedProcessingService> logger)
    {
        _logger = logger;
    }

    public async Task DoWork(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            executionCount++;

            _logger.LogInformation(
                "Scoped Processing Service is working. Count: {Count}", executionCount);

            await Task.Delay(10000, stoppingToken);
        }
    }
}

-

public class ConsumeScopedServiceHostedService : BackgroundService
{
    private readonly ILogger<ConsumeScopedServiceHostedService> _logger;

    public ConsumeScopedServiceHostedService(IServiceProvider services, 
        ILogger<ConsumeScopedServiceHostedService> logger)
    {
        Services = services;
        _logger = logger;
    }

    public IServiceProvider Services { get; }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation(
            "Consume Scoped Service Hosted Service running.");

        await DoWork(stoppingToken);
    }

    private async Task DoWork(CancellationToken stoppingToken)
    {
        _logger.LogInformation(
            "Consume Scoped Service Hosted Service is working.");

        using (var scope = Services.CreateScope())
        {
            var scopedProcessingService = 
                scope.ServiceProvider
                    .GetRequiredService<IScopedProcessingService>();

            await scopedProcessingService.DoWork(stoppingToken);
        }
    }

    public override async Task StopAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation(
            "Consume Scoped Service Hosted Service is stopping.");

        await Task.CompletedTask;
    }
}

Например, я хотел бы запустить несколько экземпляров ScopedProcessingService, которые будут работать для разных задач ( долго работает).

Источник: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1&tabs=visual-studio#consuming -a-scoped-service-in-background-task

1 Ответ

0 голосов
/ 10 апреля 2020

Можете ли вы заменить метод DoWork приведенным ниже и повторить попытку

      private async Task DoWork(CancellationToken stoppingToken)
      {
        _logger.LogInformation(
            "Consume Scoped Service Hosted Service is working.");

        using (var scope = Services.CreateScope())
        {
          var scopedProcessingService =
              scope.ServiceProvider
                  .GetServices<IScopedProcessingService>();
          foreach (var service in scopedProcessingService)
          {
            await scopedProcessingService.DoWork(stoppingToken);
          }
        }
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...