Freigeben über


.NET-Runtime stellt keine Standardmäßigen Beendigungssignalhandler mehr bereit.

Auf Unix-Systemen stellt die .NET-Runtime keinen Standard-SIGTERM-Signalhandler mehr bereit. Unter Windows stellt die .NET-Runtime keine Standardhandler mehr für die CTRL_SHUTDOWN_EVENT und CTRL_CLOSE_EVENT Signale bereit, die Äquivalente von Unix SIGTERM und SIGHUP Signalen sind.

Durch diese Änderung wird das Verhalten der Beendigungssignalbehandlung auf das Verhalten zurückgesetzt, das in .NET Framework und der klassischen Mono-Laufzeit verwendet wurde.

Eingeführte Version

.NET 10

Vorheriges Verhalten

Zuvor löste das Beenden von Signalhandlern, die von der .NET-Laufzeit registriert wurden, standardmäßig den ordnungsgemäßen Beenden der Anwendung aus. AppDomain.ProcessExit- und AssemblyLoadContext.Unloading-Ereignisse wurden ausgelöst, bevor die Anwendung beendet wurde.

Neues Verhalten

Ab .NET 10 überschreibt die .NET-Laufzeit die vom Betriebssystem bereitgestellte Signalbehandlung für das Beenden nicht. Der typische Standard-Beendigungssignalhandler, der vom Betriebssystem bereitgestellt wird, beendet die Anwendung sofort. AppDomain.ProcessExit- und AssemblyLoadContext.Unloading-Ereignisse werden nicht ausgelöst.

Art der einschneidenden Änderung

Dies ist eine Verhaltensänderung.

Grund für Änderung

Die standardmäßig von der .NET-Laufzeit registrierten Beendigungssignalhandler waren für einige App-Modelle (z. B. Konsolen- und containerisierte Anwendungen) nicht ausreichend und mit anderen App-Modellen nicht kompatibel (z. B. Windows-Dienste). Es ist besser, es bibliotheken oder Anwendungscode auf höherer Ebene zu überlassen, um Signalhandler zu registrieren, die für das jeweilige App-Modell geeignet sind.

  • Für typische ASP.NET-Anwendungen oder Anwendungen, die APIs auf höherer Ebene verwenden, wie z.B. HostingHostBuilderExtensions.UseConsoleLifetime, um spezifische Anliegen des App-Modells zu verwalten, ist keine Aktion erforderlich. Diese höherstufigen APIs registrieren gegebenenfalls Handler für SIGTERM und andere Signale.

  • Wenn Sie Beendigungssignale behandeln möchten, ohne eine Abhängigkeit von Bibliotheken auf höherer Ebene zu nehmen, können Sie das vorherige Verhalten replizieren, indem Sie Beendigungssignalhandler in Ihrer Main Methode mithilfe der PosixSignalRegistration.Create API erstellen:

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
}

Betroffene APIs