Compartilhar via


O runtime do .NET não fornece mais manipuladores de sinal de terminação padrão

Em sistemas Unix, o runtime do .NET não fornece mais um manipulador de sinal SIGTERM padrão. No Windows, o runtime do .NET não fornece mais manipuladores padrão para o e CTRL_SHUTDOWN_EVENT osCTRL_CLOSE_EVENT sinais, que são equivalentes de Unix SIGTERM e SIGHUP sinais.

Essa alteração reverte o comportamento de tratamento de sinal de terminação para o que costumava ser no .NET Framework e no runtime clássico do Mono.

Versão introduzida

.NET 10

Comportamento anterior

Anteriormente, os manipuladores de sinal de terminação registrados pelo runtime do .NET por padrão disparavam a saída normal do aplicativo. Eventos AppDomain.ProcessExit e AssemblyLoadContext.Unloading foram gerados antes da saída do aplicativo.

Novo comportamento

A partir do .NET 10, o runtime do .NET não substitui o tratamento de sinal de terminação fornecido pelo sistema operacional. O manipulador de sinal de terminação padrão típico fornecido pelo sistema operacional encerra o aplicativo imediatamente. Eventos AppDomain.ProcessExit e AssemblyLoadContext.Unloading não são gerados.

Tipo de mudança disruptiva

Essa é uma mudança comportamental.

Motivo da alteração

Os manipuladores de sinal de terminação registrados pelo runtime do .NET por padrão eram insuficientes para alguns modelos de aplicativo (por exemplo, console e aplicativos em contêineres) e incompatíveis com outros modelos de aplicativo (por exemplo, serviços do Windows). É melhor deixá-lo para bibliotecas de nível superior ou código de aplicativo para registrar manipuladores de sinal apropriados para o modelo de aplicativo especificado.

  • Nenhuma ação é necessária para aplicativos ASP.NET típicos ou para aplicativos que usam APIs de nível superior, como HostingHostBuilderExtensions.UseConsoleLifetime, para lidar com preocupações específicas do modelo de aplicativo. Essas APIs de nível superior registram manipuladores para SIGTERM e outros sinais conforme apropriado.

  • Se você quiser lidar com sinais de terminação sem depender de bibliotecas de nível superior, poderá replicar o comportamento anterior criando manipuladores de sinal de terminação em seu Main método usando a 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
}

APIs afetadas