Windows Сервисное решение с использованием. net core 3.1 и IHostBuilder - PullRequest
0 голосов
/ 04 апреля 2020

У меня есть требование для создания службы windows, которая будет считывать из n (настраиваемое число) сокетов TCP.
Я рассматриваю что-то подобное. Является ли подходящим / хорошим проектом для службы windows для создания нескольких асин c процессов, подобных этому? Я хочу использовать основной DI-контейнер. net. Так что в этом случае я могу внедрить такие сервисы, как TcpSockerReaderService, но, скорее всего, и другие. Есть лучший способ сделать это? Достигнет ли токен отмены экземпляров Socket Reader, если служба отключена в Windows службах или сервер отключен изящно? Любой совет или комментарий будут оценены.

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) => 
        Host.CreateDefaultBuilder(args)
            .ConfigureServices((hostContext, services) =>
            {
                services.AddHostedService<Worker>();
                services.AddScoped<ITcpSocketReaderService, TcpSocketReaderService>();

            }).UseWindowsService();
}


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

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

    public IServiceProvider Services { get; }

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

        int socketCount = 5;  //get from config
        for (var socketID = 1; socketID <= socketCount; socketID++)
        {
            await ProcessSocket(socketID, stoppingToken);
        }
        Console.WriteLine("Socket Worker Process Spawned");

        while (!stoppingToken.IsCancellationRequested) ;
    }

    private async Task ProcessSocket(int socketID, CancellationToken stoppingToken)
    {
        _logger.LogInformation($"ProcessSocket is reading SocketID {socketID}.");

        IServiceScope serviceScope = Services.CreateScope();
        using var scope = serviceScope;
        var socketReaderService = scope.ServiceProvider.GetRequiredService<ITcpSocketReaderService>();

        //socketID will be mapped to TCP End Point
        await socketReaderService.ReadSocket(socketID, stoppingToken);
    }


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

        await Task.CompletedTask;
    }
}
...