Необработанные исключения от BackgroundService

В предыдущих версиях поведение было следующим: если класс BackgroundService выдавал необработанное исключение, оно терялось и служба не отвечала на запросы. В .NET 6 это поведение было исправлено за счет регистрации исключения и остановки работы узла.

Описание изменения

В предыдущих версиях .NET при возникновении исключения после переопределения BackgroundService.ExecuteAsync(CancellationToken) узел продолжал работать и сообщение не регистрировалось.

Начиная с .NET 6, исключение, возникающее после переопределения BackgroundService.ExecuteAsync(CancellationToken), регистрируется в текущем интерфейсе ILogger. По умолчанию при возникновении необработанного исключения работа узла останавливается.

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

.NET 6

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

Новое поведение соответствует моделям поведения других приложений при возникновении необработанного исключения. Разработчиков приводили в замешательство ситуации, когда класс BackgroundService сталкивается с ошибкой, но данные о ней не регистрировались. Оптимальным поведением по умолчанию является остановка работы узла, поскольку необработанные исключения не должны игнорироваться. Они указывают на проблему, требующую внимания.

Если вы хотите использовать предыдущее поведение, когда необработанное исключении в BackgroundService не останавливало работу узла, можно для параметра HostOptions.BackgroundServiceExceptionBehavior задать значение BackgroundServiceExceptionBehavior.Ignore.

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

Затронутые API