.NET 运行时不再提供默认终止信号处理程序

在 Unix 系统上,.NET 运行时不再提供默认的 SIGTERM 信号处理程序。 在 Windows 上,.NET 运行时不再为 CTRL_SHUTDOWN_EVENTCTRL_CLOSE_EVENTUnix 和信号提供默认处理程序,这些处理程序等效于 Unix SIGTERMSIGHUP信号。

此更改会将终止信号处理行为还原为在 .NET Framework 和经典 Mono 运行时中使用的行为。

已引入的版本

.NET 10 预览版 5

以前的行为

以前,默认情况下,.NET 运行时注册的终止信号处理程序触发了正常应用程序退出。 AppDomain.ProcessExitAssemblyLoadContext.Unloading 事件在应用程序退出之前被引发。

新行为

从 .NET 10 开始,.NET 运行时不会覆盖作系统提供的终止信号处理。 作系统提供的典型默认终止信号处理程序会立即终止应用程序。 AppDomain.ProcessExitAssemblyLoadContext.Unloading 事件未被引发。

破坏性变更的类型

这是行为 变化

更改原因

默认情况下,.NET 运行时注册的终止信号处理程序对于某些应用模型(例如控制台和容器化应用程序)和与其他应用模型不兼容(例如 Windows 服务)是不够的。 最好将其留给更高级别的库或应用程序代码,以注册适用于给定应用模型的信号处理程序。

  • 对于典型的 ASP.NET 应用程序或使用更高级别 API(例如 HostingHostBuilderExtensions.UseConsoleLifetime 处理应用模型特定问题)的应用程序,无需执行任何操作。 这些更高级别 API 会根据需要为 SIGTERM 和其他信号注册处理程序。

  • 如果要在不依赖于更高级别的库的情况下处理终止信号,可以使用 API 在方法PosixSignalRegistration.Create中创建Main终止信号处理程序来复制以前的行为:

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
}

受影响的 API