来自 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