在 Unix 系统上,.NET 运行时不再提供默认的 SIGTERM 信号处理程序。 在 Windows 上,.NET 运行时不再为 CTRL_SHUTDOWN_EVENTCTRL_CLOSE_EVENTUnix 和信号提供默认处理程序,这些处理程序等效于 Unix SIGTERM 和SIGHUP信号。
此更改会将终止信号处理行为还原为在 .NET Framework 和经典 Mono 运行时中使用的行为。
已引入的版本
.NET 10 预览版 5
以前的行为
以前,默认情况下,.NET 运行时注册的终止信号处理程序触发了正常应用程序退出。 AppDomain.ProcessExit 和 AssemblyLoadContext.Unloading 事件在应用程序退出之前被引发。
新行为
从 .NET 10 开始,.NET 运行时不会覆盖作系统提供的终止信号处理。 作系统提供的典型默认终止信号处理程序会立即终止应用程序。 AppDomain.ProcessExit 和 AssemblyLoadContext.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
}