IHost.RunAsync und IHost.StopAsync werden ausgelöst, wenn ein BackgroundService fehlschlägt

Wenn ein BackgroundService Fehler mit einer Ausnahme von der ExecuteAsync Methode auftritt und HostOptions.BackgroundServiceExceptionBehavior auf StopHost (Standardeinstellung) festgelegt ist, stoppt der Host. In .NET 11 schlagen die von RunAsync zurückgegebenen Vorgänge, StopAsync, WaitForShutdownAsync und ihre synchronen Entsprechungen jetzt mit einer Ausnahme fehl, anstatt erfolgreich abzuschließen.

Eingeführt in Version

.NET 11 Vorschau 3

Bisheriges Verhalten

Wenn zuvor eine Ausnahme von einer BackgroundService-Methode ausgelöst wurde und HostOptions.BackgroundServiceExceptionBehavior auf BackgroundServiceExceptionBehavior.StopHost gesetzt war, wurde die Aufgabe, die durch den Aufruf von RunAsync, StopAsync oder WaitForShutdownAsync zurückgegeben wurde, erfolgreich abgeschlossen. Dies bedeutete in der Regel, dass die Anwendung mit einem Erfolgsausgangscode (Null) beendet wurde.

Neues Verhalten

Ab .NET 11, wenn ein BackgroundService eine Ausnahme von der ExecuteAsync-Methode auslöst und HostOptions.BackgroundServiceExceptionBehavior auf BackgroundServiceExceptionBehavior.StopHost festgelegt ist, schlägt die Aufgabe, die beim Aufrufen von RunAsync, StopAsync oder WaitForShutdownAsync zurückgegeben wird, mit einer Ausnahme fehl. Die Anwendung wird in der Regel mit einem Fehlerausgangscode (ungleich Null) beendet.

  • Wenn ein einzelner Dienst fehlschlägt, wird die vom Dienst ausgelöste Ausnahme erneut ausgelöst.
  • Wenn mehrere Dienste fehlschlagen, werden ihre Fehlerausnahmen in einem AggregateException kombiniert.

Art der einschneidenden Änderung

Diese Änderung ist eine Verhaltensänderung.

Grund für die Änderung

Wenn eine Anwendung aufgrund eines Fehlers beendet wird, sollte sie nicht mit einem Erfolgsausgangscode beendet werden. Das vorherige Verhalten hat den Fehler ausgeblendet, wodurch es schwieriger wird, die Ausnahme zu erkennen und zu diagnostizieren, die ihn verursacht hat.

Die empfohlene Aktion besteht darin, nichts zu tun – eine fehlerhafte Anwendung sollte mit einem Fehlerausgangscode, dem neuen Verhalten, beendet werden.

Wenn Sie das vorherige Verhalten beibehalten und mit einem Erfolgs-Exit-Code beenden müssen, schließen Sie await von RunAsync oder StopAsync in einen try-catch-Block ein.

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

Betroffene APIs