TGViewer
НеСерьезный шарпист НеСерьезный шарпист @serious_seesharp · 2.4K subscribers
Post #73 3.86K
НеСерьезный шарпист В .NET 8 были выпущены интересные изменения в библиотеке Microsoft.Extensions.Hosting, на которые многие почему-то не обратили внимания. Данная либа предоставляет возможности для создания фоновых задач в шаблоне ASP.NET приложения, а также для создания отдельных…
Помимо изменений в IHostedService одним из главных нововведений в Microsoft.Extensions.Hosting в .NET 8 стало добавление нового интерфейса IHostedLifecycleService, который значительно упрощает управление жизненным циклом служб.

Данный интерфейс интерфейс расширяет IHostedService, добавляя методы для событий жизненного цикла, которые происходят до или после существующих StartAsync и StopAsync:
public partial interface IHostedLifecycleService : Microsoft.Extensions.Hosting.IHostedService
{
Task StartingAsync(CancellationToken cancellationToken);
Task StartedAsync(CancellationToken cancellationToken);
Task StoppingAsync(CancellationToken cancellationToken);
Task StoppedAsync(CancellationToken cancellationToken);
}


Метод StartingAsync для всех зарегистрированных служб будет запущен прежде, чем будет вызван StartAsync. Это может использоваться для выполнения некоторых проверок перед запуском приложения или инициализацией, например для проверки лицензий, обновлении кешей, применение миграций бд, инициализацию зависимостей (синглтонов). Это позволяет нам, если что-то пойдет не так, потенциально остановить приложение до того, как какие-либо размещенные службы начнут выполнять свою основную рабочую нагрузку.

StartedAsync будет вызываться после завершения всех методов StartAsync для зарегистрированных размещенных служб. Это может использоваться для проверки состояния или условий приложения непосредственно перед тем, как отметить приложение как успешно запущенное.

StoppingAsync может использоваться для сохранения состояния перед завершением, а StoppedAsync - для информирования других зависимостей о том, что служба более не доступна.
public class DatabaseLifecycleService : IHostedLifecycleService
{
public async Task StartingAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StartingAsync: Проверка конфигурации...");
await Task.Delay(500, cancellationToken);
}

public async Task StartAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StartAsync: Подключение к базе данных...");
await Task.Delay(500, cancellationToken);
}

public async Task StartedAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StartedAsync: Приложение готово!");
}

public async Task StoppingAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StoppingAsync: Закрытие соединений...");
await Task.Delay(500, cancellationToken);
}

public async Task StopAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StopAsync: Служба завершает работу...");
}

public async Task StoppedAsync(CancellationToken cancellationToken)
{
Console.WriteLine("StoppedAsync: Соединения закрыты. Служба завершена.");
}
}
  • 👍 17
  • ❤ 5
  • 🔥 5
More from @serious_seesharp
  1. Jul 11, 2026Знакомый создал бота @booster_tbot, для прохождения мок-собесов бесплатно, а вопросы основ…
  2. Jun 30, 2025Всем, привет! Мы сейчас начинаем отбор докладов на осеннюю конфу "Стачка" в Питере. Если у…
  3. Jun 28, 2025Столкнулся с тем, что, как выяснилось, не всем очевидно для чего нужен ValueTask и когда е…
  4. Jun 5, 2025Post #85
  5. May 24, 2025Давно хотел сделать розыгрыш, и вот, кажется, время настало 🥰 Не надо никуда ничего скиды…
  6. May 23, 2025👩‍💻 Когда в C# 12 появились primary constructors (первичные конструкторы класс/структур)…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →