Compartir por


BackgroundService ejecuta todo ExecuteAsync como una tarea

BackgroundService ahora ejecuta la totalidad de ExecuteAsync en un subproceso en segundo plano. Anteriormente, la parte sincrónica de ExecuteAsync (antes del primer await) se ejecutaba en el subproceso principal durante el inicio del servicio, lo que impedía que otros servicios se iniciasen. Solo el código después de la primera ejecución de await se ejecutó en un subproceso en segundo plano.

Versión introducida

.NET 10

Comportamiento anterior

Anteriormente, la parte sincrónica de ExecuteAsync se ejecutó en el subproceso principal y bloqueó el inicio de otros servicios.

Nuevo comportamiento

A partir de .NET 10, todo ExecuteAsync se ejecuta en un subproceso en segundo plano y ninguna parte de este impide que se inicien otros servicios.

Tipo de cambio disruptivo

Este es un cambio de comportamiento.

Motivo del cambio

El comportamiento anterior era un problema común que no satisface las expectativas del usuario. La mayoría de los implementadores de BackgroundService no entendieron que la parte sincrónica antes del primer await bloqueaba el inicio de otros servicios durante el inicio de la aplicación.

Si necesita que alguna parte de su BackgroundService.ExecuteAsync se ejecute antes durante el inicio (de forma sincrónica y bloqueando otros servicios), puede realizar una de las siguientes acciones:

  • Coloque el código que necesita ejecutarse sincrónicamente en el constructor y se ejecuta como parte de la construcción del servicio.
  • Invalide StartAsync y realice algún trabajo antes de llamar a base.StartAsync. StartAsync retiene el comportamiento de que su parte sincrónica se ejecuta síncronamente durante el inicio, bloqueando el inicio de otros servicios.
  • Si desea ejecutar código en un momento más específico durante el inicio del servicio, implemente Microsoft.Extensions.Hosting.IHostedLifecycleService en BackgroundService.
  • Descarta BackgroundService por completo e implementa tu propio Microsoft.Extensions.Hosting.IHostedService.

Las APIs afectadas