Compartir a través de


El entorno de ejecución de .NET ya no proporciona controladores de señal de terminación predeterminados

En los sistemas Unix, el entorno de ejecución de .NET ya no proporciona un controlador de señal SIGTERM predeterminado. En Windows, el entorno de ejecución de .NET ya no proporciona controladores predeterminados para las CTRL_SHUTDOWN_EVENT señales y CTRL_CLOSE_EVENT, que son equivalentes de Unix SIGTERM y SIGHUP señales.

Este cambio revierte el comportamiento de control de señales de terminación a lo que solía estar en .NET Framework y el entorno de ejecución clásico de Mono.

Versión introducida

.NET 10

Comportamiento anterior

Anteriormente, los controladores de señal de terminación registrados por el entorno de ejecución de .NET desencadenan de forma predeterminada la salida de la aplicación correcta. Los eventos AppDomain.ProcessExit y AssemblyLoadContext.Unloading fueron activados antes de que se cerrara la aplicación.

Nuevo comportamiento

A partir de .NET 10, el entorno de ejecución de .NET no invalida el control de señales de terminación proporcionado por el sistema operativo. El controlador de señal de terminación predeterminado típico proporcionado por el sistema operativo finaliza la aplicación inmediatamente. AppDomain.ProcessExit y AssemblyLoadContext.Unloading no generan eventos.

Tipo de cambio disruptivo

Se trata de un cambio de comportamiento .

Motivo del cambio

Los controladores de señal de terminación registrados por el entorno de ejecución de .NET de forma predeterminada no eran suficientes para algunos modelos de aplicación (por ejemplo, aplicaciones en contenedor y consola) y incompatibles con otros modelos de aplicación (por ejemplo, servicios de Windows). Es mejor dejarlo en bibliotecas de nivel superior o código de aplicación para registrar controladores de señal adecuados para el modelo de aplicación determinado.

  • No es necesario realizar ninguna acción para aplicaciones o aplicaciones de ASP.NET típicas que usan API de nivel superior, como HostingHostBuilderExtensions.UseConsoleLifetime para controlar problemas específicos del modelo de aplicación. Estas API de nivel superior registran controladores para SIGTERM y otras señales según sea necesario.

  • Si desea controlar las señales de terminación sin depender de bibliotecas de nivel superior, puede replicar el comportamiento anterior mediante la creación de controladores de señal de terminación en Main el método mediante la 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
}

Las APIs afectadas