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 как части более крупной системы.
-----------------------------------------------------------------------------------
Комментариев нет:
Отправить комментарий