вторник, 26 мая 2026 г.

DeepSeek, BackgroundServices, BackgroundVersusWorker

DeepSeek, BackgroundServices, BackgroundVersusWorker

https://chat.deepseek.com/share/owplujvludi0f8ns0h

D:\Projects\VS\2605\BackgroundVersusWorker\DeepSeek\WebAppWithBackgroundService\WebAppWithBackgroundService.slnx

D:\Projects\VS\2605\BackgroundVersusWorker\DeepSeek\WebAppWithBackgroundService\WebAppWithBackgroundService01\WebAppWithBackgroundService01.csproj

-----------------------------------------------------
https://chat.deepseek.com/share/q9ewk5jvpkiku39uon
-----------------------------------------------------
WebAppWithBackgroundService01
-------------------------------
Worker — это готовый шаблон проекта (project template),
использующий внутри класса BackgroundService (или его наследника).
Фактически, Worker является «упакованной версией» BackgroundService для быстрого старта.
--------------------------------------------------------
1. Разница между понятиями
Путаница возникает из-за смешения терминов: «тип класса» и «шаблон проекта».

BackgroundService (Класс)
Это базовый абстрактный класс в .NET (из пространства имен Microsoft.Extensions.Hosting), предназначенный для создания долгоиграющих фоновых задач.

Суть: Это просто класс C#, который можно добавить в любое приложение (ASP.NET Core, консольное и т.д.).

Механика: Вы наследуетесь от него и переопределяете метод ExecuteAsync.

Расположение: Обычно это файл .cs в любой папке проекта.

Worker (Шаблон проекта / Sdk)
Когда говорят «создать Worker», имеют в виду шаблон Worker Service, который появляется при создании нового проекта.
Этот шаблон автоматически генерирует проект, который:

Использует Microsoft.NET.Sdk.Worker (облегченная версия SDK без веб-компонентов).

Содержит файл Worker.cs, в котором класс Worker наследуется от BackgroundService.

Содержит Program.cs, настроенный на использование Generic Host (без веб-сервера Kestrel по умолчанию).

Итог: Worker — это готовая «коробка» с минимальным кодом, BackgroundService — это «двигатель» внутри неё.
---------------------------------------------------------------------------------------------------------

2. Когда что использовать
Используйте шаблон Worker (создаете новый проект Worker Service), когда:
Вам нужен выделенный фоновый процесс (демон, служба Windows/Linux), который не обрабатывает HTTP-запросы.

Примеры: Обработчик очередей сообщений (RabbitMQ/Kafka), планировщик Cron-задач, служба очистки временных файлов.

Причина: Приложение будет легковесным. В нем нет лишнего кода контроллеров, Middleware,
и оно не будет занимать порты для HTTP, если вы сами этого не добавите.

Используйте класс BackgroundService (добавляете в существующий проект), когда:
У вас уже есть приложение (например, ASP.NET Core Web API) и нужно внутри него запустить фоновый процесс.

Примеры: Отправка писем раз в минуту внутри сайта, синхронизация кэша в фоне,
периодическая генерация отчетов прямо на веб-сервере.
-------------------------------------------------------------
Как добавить: Создаете класс, наследующий BackgroundService, и регистрируете его в Program.cs:

csharp
services.AddHostedService<MyCustomBackgroundService>();
--------------------------------------------------------------------
Визуальное сравнение структуры
Характеристика	BackgroundService (Класс)	Worker (Проект)
Что это	Класс внутри вашей кодовой базы	Отдельный исполняемый проект (.exe)
Хостинг	Добавляется в любой Generic Host	Имеет собственный Generic Host из коробки
ASP.NET Core	Часто живет в проекте с контроллерами	Нет ссылок на ASP.NET по умолчанию
Сценарий	Фоновая задача внутри веб-приложения
----------------------------------------------------------------------
Важное дополнение
Не путайте BackgroundService с интерфейсом IHostedService.
BackgroundService — это удобная обертка над IHostedService, 
которая берет на себя управление жизненным циклом задачи (запуск/остановка через CancellationToken),
тогда как IHostedService требует ручной реализации StartAsync и StopAsync.
-----------------------------------------------------------------------
Приложение 1: BackgroundService внутри ASP.NET Core Web API
Сценарий: У нас есть веб-сайт, который должен раз в 10 секунд проверять
«базу данных» и логировать количество активных пользователей. При этом сайт продолжает отвечать на HTTP-запросы.

Шаг 1. Создайте проект
В терминале:

bash
dotnet new web -n WebAppWithBackgroundService
cd WebAppWithBackgroundService
Шаг 2. Создайте класс фоновой службы
Создайте папку Services и добавьте файл ActiveUsersMonitor.cs:

csharp
// Services/ActiveUsersMonitor.cs
namespace WebAppWithBackgroundService.Services;

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

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

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        _logger.LogInformation("Мониторинг пользователей запущен.");

        // Цикл будет работать, пока приложение не выключится
        while (!stoppingToken.IsCancellationRequested)
        {
            // Имитация запроса к БД
            var random = new Random();
            int activeUsers = random.Next(100, 500);
            
            _logger.LogInformation("[{time}] Количество активных пользователей: {count}", 
                DateTimeOffset.Now, activeUsers);

            // Ждем 10 секунд, но при этом можем обработать команду остановки
            await Task.Delay(TimeSpan.FromSeconds(10), stoppingToken);
        }

        _logger.LogInformation("Мониторинг пользователей остановлен.");
    }
}
Шаг 3. Зарегистрируйте службу
Полностью замените содержимое Program.cs:

csharp
// Program.cs
using WebAppWithBackgroundService.Services;

var builder = WebApplication.CreateBuilder(args);

// Регистрируем наш фоновый сервис
builder.Services.AddHostedService<ActiveUsersMonitor>();

var app = builder.Build();

// Простой эндпоинт, чтобы убедиться, что веб-сервер работает
app.MapGet("/", () => "Веб-приложение работает! Откройте консоль, чтобы увидеть логи мониторинга.");

app.Run();
Шаг 4. Запуск
bash
dotnet run
Откройте браузер на http://localhost:5000 (или порт, который выдаст консоль).
Страница загрузится, а в консоли каждые 10 секунд будут появляться сообщения.

Ключевой вывод: Класс ActiveUsersMonitor внедрен в веб-приложение.
Это и есть типичное использование BackgroundService как части более крупной системы.

-----------------------------------------------------------------------------------

Комментариев нет:

Отправить комментарий