Udostępnij przez


Środowisko uruchomieniowe platformy .NET nie udostępnia już domyślnych procedur obsługi sygnałów zakończenia

W systemach Unix środowisko uruchomieniowe platformy .NET nie zapewnia już domyślnej obsługi sygnałów SIGTERM. W systemie Windows środowisko uruchomieniowe platformy .NET nie udostępnia już domyślnych programów obsługi dla CTRL_SHUTDOWN_EVENT sygnałów iCTRL_CLOSE_EVENT, które są odpowiednikami systemów Unix SIGTERM i SIGHUP sygnałów.

Ta zmiana przywraca zachowanie obsługi sygnału zakończenia do tego, co było używane w programie .NET Framework i klasycznym środowisku uruchomieniowym Mono.

Wersja wprowadzona

.NET 10

Poprzednie zachowanie

Wcześniej programy obsługi sygnałów zakończenia zarejestrowane przez środowisko uruchomieniowe platformy .NET domyślnie wyzwalały bezproblemowe zakończenie aplikacji. AppDomain.ProcessExit i AssemblyLoadContext.Unloading zdarzenia zostały zgłoszone przed zamknięciem aplikacji.

Nowe zachowanie

Począwszy od platformy .NET 10, środowisko uruchomieniowe platformy .NET nie zastępuje obsługi sygnałów zakończenia udostępnianych przez system operacyjny. Typowa domyślna procedura obsługi sygnału zakończenia zapewniana przez system operacyjny natychmiast kończy aplikację. AppDomain.ProcessExit i AssemblyLoadContext.Unloading zdarzenia nie są wywoływane.

Typ zmiany przełamującej

Jest to zmiana zachowania.

Przyczyna zmiany

Programy obsługi sygnałów zakończenia zarejestrowane przez środowisko uruchomieniowe platformy .NET domyślnie były niewystarczające dla niektórych modeli aplikacji (na przykład konsoli i aplikacji konteneryzowanych) i niezgodnych z innymi modelami aplikacji (na przykład usługami systemu Windows). Lepiej pozostawić biblioteki wyższego poziomu lub kod aplikacji, aby zarejestrować programy obsługi sygnałów odpowiednie dla danego modelu aplikacji.

  • Nie jest wymagane żadne działanie dla typowych aplikacji ASP.NET ani aplikacji korzystających z wyższych poziomów interfejsów API, takich jak HostingHostBuilderExtensions.UseConsoleLifetime, do obsługi problemów specyficznych dla modelu aplikacji. Te interfejsy API wyższego poziomu przypisują programy obsługi dla sygnałów takich jak SIGTERM i innych w razie potrzeby.

  • Jeśli chcesz obsługiwać sygnały zakończenia bez zależności od bibliotek wyższego poziomu, możesz replikować poprzednie zachowanie, tworząc procedury obsługi sygnałów zakończenia w Main metodzie przy użyciu interfejsu PosixSignalRegistration.Create API:

static void Main()
{
    using var termSignalRegistration =
        PosixSignalRegistration.Create(
            PosixSignal.SIGTERM,
            (_) => Environment.Exit(0));

    // Replicates the previous behavior on Windows
    using var sigHupSignalRegistration =
        PosixSignalRegistration.Create(
            PosixSignal.SIGHUP,
            (_) => Environment.Exit(0));

    // Your application code here
}

Interfejsy API, których dotyczy problem