Поделиться через


BackgroundService выполняет весь ExecuteAsync в качестве задачи

BackgroundService теперь выполняет всю работу ExecuteAsync на фоновом потоке. Ранее синхронная часть ExecuteAsync (до первой await) выполнялась на основном потоке выполнения во время запуска службы, что препятствовало запуску других служб. Только код после первого await запускался на фоновом потоке.

Представленная версия

.NET 10

Предыдущее поведение

Ранее синхронная часть ExecuteAsync выполнялась в основном потоке и блокировала запуск других служб.

Новое поведение

Начиная с .NET 10, все ExecuteAsync выполняется в фоновом потоке, и ни одна его часть не блокирует запуск других служб.

Тип разрушающего изменения

Это изменение поведения.

Причина изменения

Предыдущее поведение было распространенной ловушкой, которая не соответствовала ожиданиям пользователей. Большинство разработчиков BackgroundService не понимали, что синхронная часть перед первым вызовом await блокировала запуск других служб во время запуска приложения.

Если требуется запуск любой части вашего BackgroundService.ExecuteAsync во время старта (в синхронном режиме, блокирующем другие службы), вы можете выполнить одно из следующих действий:

  • Поместите код, который должен синхронно выполняться в конструкторе, он будет запускаться как часть процесса создания службы.
  • Переопределите StartAsync и выполните некоторые действия перед вызовом base.StartAsync. StartAsync сохраняет поведение, при котором его синхронная часть запускается синхронно и блокирует запуск других служб во время старта.
  • Если вы хотите запустить код в более определенное время при запуске службы, реализуйте Microsoft.Extensions.Hosting.IHostedLifecycleService в вашем BackgroundService.
  • Откажитесь от BackgroundService и создайте собственный Microsoft.Extensions.Hosting.IHostedService.

Затронутые API