在 Unix 系統上,.NET 運行時間不再提供預設 SIGTERM 訊號處理程式。 在 Windows 上,.NET 執行階段不再提供 和CTRL_SHUTDOWN_EVENTCTRL_CLOSE_EVENT 訊號的預設處理常式,這些處理常式相當於 Unix SIGTERM 和SIGHUP訊號。
此變更會將終止訊號處理行為還原為 .NET Framework 和傳統 Mono 執行階段中的動作。
推出的版本
.NET 10
先前的行為
先前,.NET 執行階段所註冊的終止訊號處理常式預設會觸發正常的應用程式結束。 AppDomain.ProcessExit 和 AssemblyLoadContext.Unloading 事件是在應用程式結束之前引發的。
新行為
從 .NET 10 開始,.NET 執行階段不會覆寫作業系統所提供的終止訊號處理。 作業系統提供的一般預設終止訊號處理常式會立即終止應用程式。 AppDomain.ProcessExit 和 AssemblyLoadContext.Unloading 事件不會被觸發。
破壞性變更的類型
變更的原因
根據預設,.NET 執行階段所註冊的終止訊號處理常式對於某些應用程式模型 (例如主控台和容器化應用程式) 來說都不足,而且與其他應用程式模型 (例如 Windows 服務) 不相容。 最好將它留給較高層級的連結庫或應用程式程序代碼,以註冊適用於指定應用程式模型的訊號處理程式。
建議的動作
一般 ASP.NET 應用程式或使用較高層級 API 的應用程式不需要採取任何動作,例如 HostingHostBuilderExtensions.UseConsoleLifetime 處理應用程式模型的特定考慮。 這些較高層級的 API 會適當地註冊 SIGTERM 和其他訊號的處理程式。
如果您想要處理終止訊號而不相依於較高層級的程式庫,您可以使用 API 在
Main方法中PosixSignalRegistration.Create建立終止訊號處理常式,以複寫先前的行為:
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
}