BackgroundServiceがExecuteAsync メソッドの例外で失敗し、HostOptions.BackgroundServiceExceptionBehaviorが StopHost (既定値) に設定されている場合、ホストは停止します。 .NET 11 では、RunAsync、StopAsync、WaitForShutdownAsync から返されたタスクが、正常に完了するのではなく、例外で失敗するようになりました。
導入されたバージョン
.NET 11 Preview 3
以前の動作
以前は、 BackgroundService がその ExecuteAsync メソッドから例外をスローし、 HostOptions.BackgroundServiceExceptionBehavior が BackgroundServiceExceptionBehavior.StopHostに設定されている場合、 RunAsync、 StopAsync、または WaitForShutdownAsync の呼び出しから返されたタスクは正常に完了しました。 これは通常、アプリケーションが成功終了コード (ゼロ) で終了したことを意味します。
新しい動作
.NET 11 以降では、 BackgroundServiceが ExecuteAsync メソッドから例外をスローし、HostOptions.BackgroundServiceExceptionBehavior が BackgroundServiceExceptionBehavior.StopHost に設定されている場合、RunAsync、StopAsync、または WaitForShutdownAsync の呼び出しから返されたタスクは例外で失敗します。 通常、アプリケーションはエラー終了コード (ゼロ以外) で終了します。
- 1 つのサービスが失敗した場合、サービスによってスローされた例外が再スローされます。
- 複数のサービスが失敗した場合、その例外は AggregateExceptionに結合されます。
破壊的変更の種類
この変更は 動作の変更です。
変更理由
障害が原因でアプリケーションが停止した場合は、成功終了コードで終了しないでください。 前の動作ではエラーが隠れ、原因となった例外の検出と診断が困難になりました。
推奨されるアクション
推奨されるアクションは、何も行わない方法です。失敗したアプリケーションは、新しい動作であるエラー終了コードを使用して終了する必要があります。
前の動作を維持し、成功終了コードで終了する必要がある場合は、awaitまたはRunAsyncのStopAsyncをtry-catch ブロックにラップします。
try
{
await host.RunAsync();
}
catch (Exception ex)
{
// Log or inspect the exception if needed.
}
影響を受ける API
- 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 (既定の実装)
.NET