BackgroundService が失敗したときに IHost.RunAsync と IHost.StopAsync がスローされる

BackgroundServiceExecuteAsync メソッドの例外で失敗し、HostOptions.BackgroundServiceExceptionBehaviorStopHost (既定値) に設定されている場合、ホストは停止します。 .NET 11 では、RunAsyncStopAsyncWaitForShutdownAsync から返されたタスクが、正常に完了するのではなく、例外で失敗するようになりました。

導入されたバージョン

.NET 11 Preview 3

以前の動作

以前は、 BackgroundService がその ExecuteAsync メソッドから例外をスローし、 HostOptions.BackgroundServiceExceptionBehaviorBackgroundServiceExceptionBehavior.StopHostに設定されている場合、 RunAsyncStopAsync、または WaitForShutdownAsync の呼び出しから返されたタスクは正常に完了しました。 これは通常、アプリケーションが成功終了コード (ゼロ) で終了したことを意味します。

新しい動作

.NET 11 以降では、 BackgroundServiceExecuteAsync メソッドから例外をスローし、HostOptions.BackgroundServiceExceptionBehaviorBackgroundServiceExceptionBehavior.StopHost に設定されている場合、RunAsyncStopAsync、または WaitForShutdownAsync の呼び出しから返されたタスクは例外で失敗します。 通常、アプリケーションはエラー終了コード (ゼロ以外) で終了します。

  • 1 つのサービスが失敗した場合、サービスによってスローされた例外が再スローされます。
  • 複数のサービスが失敗した場合、その例外は AggregateExceptionに結合されます。

破壊的変更の種類

この変更は 動作の変更です。

変更理由

障害が原因でアプリケーションが停止した場合は、成功終了コードで終了しないでください。 前の動作ではエラーが隠れ、原因となった例外の検出と診断が困難になりました。

推奨されるアクションは、何も行わない方法です。失敗したアプリケーションは、新しい動作であるエラー終了コードを使用して終了する必要があります。

前の動作を維持し、成功終了コードで終了する必要がある場合は、awaitまたはRunAsyncStopAsynctry-catch ブロックにラップします。

try
{
    await host.RunAsync();
}
catch (Exception ex)
{
    // Log or inspect the exception if needed.
}

影響を受ける API