Exceptions non prises en charge d’un BackgroundService

Dans les versions précédentes, lorsqu’un BackgroundService levait une exception non prise en charge, l’exception était perdue, et le service ne répondait pas. .NET 6 corrige ce comportement en journalisant l’exception et en arrêtant l’hôte.

Description de la modification

Dans les versions précédentes de .NET, lorsqu’une exception était levée à partir d’un remplacement BackgroundService.ExecuteAsync(CancellationToken), l’hôte continuait de s’exécuter, et aucun message n’était journalisé.

À compter de .NET 6, une exception générée à partir d’un remplacement BackgroundService.ExecuteAsync(CancellationToken) est enregistrée dans le ILogger actuel. Par défaut, l’hôte est arrêté en cas d’exception non prise en charge.

Version introduite

.NET 6

Raison du changement

Ce nouveau comportement est cohérent avec celui des autres modèles d’application face à des exceptions non gérées. Il est également déroutant pour les développeurs que leur BackgroundService rencontre une erreur, mais que rien ne soit journalisé. Le meilleur comportement par défaut consiste à arrêter l’hôte, car les exceptions non gérées ne doivent pas être ignorées. Elles indiquent un problème qui mérite une attention particulière.

Si vous préférez conserver le comportement précédent, qui consiste à autoriser une exception non prise en charge dans un BackgroundService à ne pas arrêter l’hôte, vous pouvez définir HostOptions.BackgroundServiceExceptionBehavior sur BackgroundServiceExceptionBehavior.Ignore.

Host.CreateBuilder(args)
    .ConfigureServices(services =>
    {
        services.Configure<HostOptions>(hostOptions =>
        {
            hostOptions.BackgroundServiceExceptionBehavior = BackgroundServiceExceptionBehavior.Ignore;
        });
    });

API affectées