Partilhar via


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

Em sistemas Unix, o tempo de execução do .NET não fornece mais um manipulador de sinal SIGTERM padrão. No Windows, o tempo de execução do .NET não fornece mais manipuladores padrão para os CTRL_SHUTDOWN_EVENT sinais e CTRL_CLOSE_EVENT , que são equivalentes ao Unix SIGTERM e SIGHUP sinais.

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

Versão introduzida

.NET 10

Comportamento anterior

Anteriormente, os manipuladores de sinal de terminação registrados pelo tempo de execução do .NET por padrão acionavam a saída normal do aplicativo. AppDomain.ProcessExit e AssemblyLoadContext.Unloading eventos foram acionados antes da saída do aplicativo.

Novo comportamento

A partir do .NET 10, o tempo de execução do .NET não substitui a manipulação do sinal de terminação fornecida pelo sistema operacional. O manipulador de sinal de terminação padrão típico fornecido pelo sistema operacional encerra o aplicativo imediatamente. AppDomain.ProcessExit e AssemblyLoadContext.Unloading os eventos não são gerados.

Tipo de mudança disruptiva

Trata-se de uma mudança de comportamento.

Motivo da mudança

Os manipuladores de sinal de terminação registrados pelo tempo de execução do .NET por padrão eram insuficientes para alguns modelos de aplicativo (por exemplo, aplicativos de console e em contêineres) e incompatíveis com outros modelos de aplicativo (por exemplo, serviços do Windows). É melhor deixar a tarefa para bibliotecas de alto nível ou código da aplicação registrar manipuladores de sinal apropriados para o modelo de aplicação dado.

  • Nenhuma ação é necessária para aplicativos ASP.NET típicos ou 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