Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
När en BackgroundService misslyckas med ett undantag från sin ExecuteAsync-metod och HostOptions.BackgroundServiceExceptionBehavior är inställd på StopHost (som standard) stoppas värden. I .NET 11 returneras aktiviteterna från RunAsync, StopAsync, WaitForShutdownAsync och deras synkrona motsvarigheter misslyckas nu med ett undantag i stället för att slutföras.
Version lanserad
.NET 11 Förhandsversion 3
Tidigare beteende
Tidigare, när ett BackgroundService kastade ett undantag i sin ExecuteAsync-metod och HostOptions.BackgroundServiceExceptionBehavior var inställt på BackgroundServiceExceptionBehavior.StopHost, slutfördes uppgiften som kom åter från anropet RunAsync, StopAsync, eller WaitForShutdownAsync framgångsrikt. Detta innebar vanligtvis att programmet avslutades med avslutningskoden noll.
Nytt beteende
Från och med .NET 11, när en BackgroundService kastar ett undantag från dess ExecuteAsync-metod och HostOptions.BackgroundServiceExceptionBehavior är inställd på BackgroundServiceExceptionBehavior.StopHost, misslyckas uppgiften som returneras från att anropa RunAsync, StopAsync eller WaitForShutdownAsync och kastar ett undantag. Programmet avslutas vanligtvis med en felutgångskod (inte noll).
- Om en enskild tjänst misslyckas, återkastas undantaget som genereras av tjänsten.
- Om flera tjänster misslyckas kombineras deras undantag till en AggregateException.
Typ av brytande ändring
Den här ändringen är en beteendeförändring.
Orsak till ändringen
Om ett program stoppas på grund av ett fel bör det inte avslutas med en lyckad slutkod. Det tidigare beteendet dolde felet, vilket gjorde det svårare att identifiera och diagnostisera undantaget som orsakade det.
Rekommenderad åtgärd
Den rekommenderade åtgärden är att inte göra någonting – ett program som misslyckas bör avslutas med en slutkod för fel, vilket är det nya beteendet.
Om du behöver behålla det tidigare beteendet och avsluta med en lyckad slutkod, omslut await eller RunAsync eller StopAsync i ett try-catch block:
try
{
await host.RunAsync();
}
catch (Exception ex)
{
// Log or inspect the exception if needed.
}
Berörda API:er
- 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 (förvaltsimplementering)