Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Cuando un BackgroundService falla con una excepción en su método ExecuteAsync y HostOptions.BackgroundServiceExceptionBehavior se establece en StopHost (el valor predeterminado), el host se detiene. En .NET 11, las tareas devueltas desde RunAsync, StopAsync, WaitForShutdownAsync y sus equivalentes sincrónicos ahora fallan con una excepción en lugar de completarse exitosamente.
Versión introducida
.NET 11 Preview 3
Comportamiento anterior
Anteriormente, cuando un BackgroundService arrojó una excepción desde su método ExecuteAsync y HostOptions.BackgroundServiceExceptionBehavior se estableció en BackgroundServiceExceptionBehavior.StopHost, la tarea devuelta al llamar a RunAsync, StopAsync o WaitForShutdownAsync se completó con éxito. Esto suele significar que la aplicación terminó con un código de salida de éxito (cero).
Nuevo comportamiento
A partir de .NET 11, cuando un BackgroundService lanza una excepción desde su método ExecuteAsync y HostOptions.BackgroundServiceExceptionBehavior se establece en BackgroundServiceExceptionBehavior.StopHost, la tarea devuelta al llamar a RunAsync, StopAsync o WaitForShutdownAsync falla con una excepción. Normalmente, la aplicación se cierra con un código de salida de error (distinto de cero).
- Si se produce un error en un único servicio, la excepción lanzada por el servicio se lanza de nuevo.
- Si se produce un error en varios servicios, sus excepciones se combinan en un AggregateException.
Tipo de cambio disruptivo
Este es un cambio de comportamiento.
Motivo del cambio
Si una aplicación se detiene debido a un error, no debe salir con un código de salida correcto. El comportamiento anterior ocultaba el error, lo que dificultaba la detección y el diagnóstico de la excepción que lo provocaba.
Acción recomendada
La acción recomendada es no hacer nada: una aplicación con errores debe salir con un código de salida de error, que es el nuevo comportamiento.
Si necesita mantener el comportamiento anterior y salir con un código de salida de éxito, envuelva el await o StopAsync en un try-catch bloque:
try
{
await host.RunAsync();
}
catch (Exception ex)
{
// Log or inspect the exception if needed.
}
Las APIs afectadas
- Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.RunAsync
- Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.Run
- Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.StopAsync
- Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.WaitForShutdownAsync
- Microsoft.Extensions.Hosting.HostingAbstractionsHostExtensions.WaitForShutdown
- Microsoft.Extensions.Hosting.IHost.StopAsync (implementación predeterminada)