Приходилось ли создавать сервисы (фоновые службы)?

«Приходилось ли создавать сервисы (фоновые службы)?» — вопрос из категории Архитектура, который задают на 25% собеседований C# Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, создавал различные типы сервисов для выполнения фоновых задач и длительных операций.

1. Фоновые сервисы в ASP.NET Core (BackgroundService): Идеально для задач внутри веб-приложения: отправка email, обработка очередей, кэширование.

public class TimedHostedService : BackgroundService
{
    private readonly ILogger<TimedHostedService> _logger;
    private readonly IServiceScopeFactory _scopeFactory;

    public TimedHostedService(ILogger<TimedHostedService> logger, IServiceScopeFactory scopeFactory)
    {
        _logger = logger;
        _scopeFactory = scopeFactory;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Timed Hosted Service running.");
        using PeriodicTimer timer = new(TimeSpan.FromSeconds(5));

        try
        {
            while (await timer.WaitForNextTickAsync(stoppingToken))
            {
                await using (var scope = _scopeFactory.CreateAsyncScope())
                {
                    var scopedProcessor = scope.ServiceProvider
                        .GetRequiredService<IScopedProcessingService>();
                    await scopedProcessor.DoWorkAsync(stoppingToken);
                }
            }
        }
        catch (OperationCanceledException)
        {
            _logger.LogInformation("Timed Hosted Service is stopping.");
        }
    }
}
// Регистрация в Program.cs: builder.Services.AddHostedService<TimedHostedService>();

2. Windows Services (ранее NT Services): Для автономных служб, работающих под управлением Windows Service Control Manager (SCM).

using System.ServiceProcess;

public class MyWindowsService : ServiceBase
{
    private BackgroundWorker _worker;

    protected override void OnStart(string[] args)
    {
        _worker = new BackgroundWorker();
        _worker.DoWork += (s, e) => { /* Долгая фоновая работа */ };
        _worker.RunWorkerAsync();
    }

    protected override void OnStop()
    {
        _worker?.CancelAsync();
        // Освобождение ресурсов
    }
}
// Установка через sc.exe create "MyService" binPath="путь_к_exe"

3. Современные альтернативы:

  • Hangfire / Quartz.NET: Для сложного планирования фоновых заданий.
  • Azure Functions / AWS Lambda: Для бессерверного выполнения задач.
  • Worker Services в .NET: Шаблон для создания длительно работающих служб с поддержкой контейнеризации (Docker).

Ключевые аспекты: устойчивость к ошибкам, корректное логирование, поддержка graceful shutdown и конфигурируемость.