Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Lorsqu’un BackgroundService rencontre une exception dans la méthode ExecuteAsync et que HostOptions.BackgroundServiceExceptionBehavior est défini sur StopHost (valeur par défaut), l’hôte s’arrête. Dans .NET 11, les tâches retournées par RunAsync, StopAsync, WaitForShutdownAsync et leurs équivalents synchrones échouent maintenant avec une exception au lieu de se terminer correctement.
Version introduite
.NET 11 Preview 3
Comportement antérieur
Auparavant, lorsqu'une exception était levée par sa méthode et que HostOptions.BackgroundServiceExceptionBehavior était défini sur BackgroundServiceExceptionBehavior.StopHost, la tâche retournée après l'appel de RunAsync, StopAsync ou WaitForShutdownAsync se terminait avec succès. Cela signifiait généralement que l’application s’est terminée avec un code de sortie réussi (zéro).
Nouveau comportement
À partir de .NET 11, lorsqu’une BackgroundService lève une exception de sa méthode ExecuteAsync et HostOptions.BackgroundServiceExceptionBehavior est définie sur BackgroundServiceExceptionBehavior.StopHost, la tâche retournée par l’appel de RunAsync, StopAsync ou WaitForShutdownAsync échoue avec une exception. L’application se termine généralement avec un code de sortie d’échec (non zéro).
- En cas d’échec d’un seul service, l’exception levée par le service est relancée.
- Si plusieurs services échouent, leurs exceptions sont combinées en un AggregateException.
Type de changement cassant
Ce changement est un changement de comportement.
Raison du changement
Si une application s’arrête en raison d’un échec, elle ne doit pas se quitter avec un code de sortie réussi. Le comportement précédent masque l’échec, ce qui complique la détection et le diagnostic de l’exception qui l’a provoqué.
Action recommandée
L’action recommandée consiste à ne rien faire : une application défaillante doit se quitter avec un code de sortie d’échec, qui est le nouveau comportement.
Si vous devez conserver le comportement précédent et quitter avec un code de sortie indiquant une réussite, encapsulez awaitRunAsync dans un bloc StopAsynctry- :catch
try
{
await host.RunAsync();
}
catch (Exception ex)
{
// Log or inspect the exception if needed.
}
API affectées
- 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 (implémentation par défaut)