У меня есть требование для создания службы 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;
}
}