可以。我按你给的《C#跨平台捕获程序退出事件:Windows与Linux机制详解》这个方向,先写 5 篇不同角度的原创技术文章,适合发布到技术博客、资讯网站或程序员教程栏目。

每篇采用独立标题、技术讲解和代码示例,避免只替换标题、正文却高度重复。

第一篇:C#程序退出事件详解:ProcessExit与CancelKeyPress的区别

摘要: 在C#控制台程序开发中,正确处理退出事件有助于释放文件句柄、关闭数据库连接和保存运行状态。本文介绍两种常用事件的适用场景及注意事项。

一、为什么需要监听程序退出?

C#程序运行时可能因为用户操作、系统维护或正常业务结束而退出。如果程序持有文件、网络连接或其他资源,就需要考虑如何完成清理。

.NET提供了多种相关机制,其中比较常见的是 AppDomain.CurrentDomain.ProcessExit 和 Console.CancelKeyPress。

二、ProcessExit的基本用法

using System;

class Program
{
    static void Main()
    {
        AppDomain.CurrentDomain.ProcessExit += (sender, e) =>
        {
            Console.WriteLine("程序正在退出,开始清理资源");
        };

        Console.WriteLine("程序运行中...");
        Console.ReadLine();
    }
}

ProcessExit 适合在正常退出路径中执行最后的同步清理,但不能保证在所有终止情况下触发,例如进程被强制结束或系统突然断电。

三、CancelKeyPress的使用场景

Console.CancelKeyPress += (sender, e) =>
{
    Console.WriteLine("检测到终止快捷键");
    e.Cancel = true;
};

CancelKeyPress 主要用于处理控制台的 Ctrl+C 和 Ctrl+Break。将 e.Cancel 设置为 true,可以阻止默认终止操作,给程序机会自行完成退出流程。

Microsoft Learn+1

四、两者的区别

对比项目

ProcessExit

CancelKeyPress

主要用途

退出阶段清理

控制台中断处理

Ctrl+C

取决于运行环境和退出流程

专门支持

能否阻止默认终止

不能

可以

强制杀死进程

无法保证触发

无法处理

五、总结

对于普通C#控制台程序,可以结合使用两种机制。需要特别注意的是,.NET 10改变了部分操作系统终止信号的默认处理行为,因此不能依赖 ProcessExit 覆盖全部退出场景。

Microsoft Learn

第二篇:Linux环境下C#如何监听SIGTERM和SIGINT信号?

摘要: 当C#程序部署到Linux服务器时,进程可能通过终端快捷键、kill 命令或服务管理器停止。了解Linux信号机制,可以帮助开发者实现更加可靠的退出控制。

一、Linux常见终止信号

Linux通过信号向进程传递特定事件,其中常见的包括:

  • SIGINT:通常由终端Ctrl+C产生。

  • SIGTERM:请求进程终止,通常允许程序执行清理。

  • SIGHUP:传统上与终端挂断有关,也常被服务用于重新加载配置。

  • SIGKILL:由操作系统直接终止进程,应用无法捕获或忽略。

二、使用PosixSignalRegistration

对于现代.NET应用,可以使用 System.Runtime.InteropServices.PosixSignalRegistration 注册处理逻辑。

using System;
using System.Runtime.InteropServices;
using System.Threading;

class Program
{
    static void Main()
    {
        using var registration =
            PosixSignalRegistration.Create(
                PosixSignal.SIGTERM,
                context =>
                {
                    Console.WriteLine("收到SIGTERM信号");
                    context.Cancel = true;
                });

        Console.WriteLine("服务运行中");
        Thread.Sleep(Timeout.Infinite);
    }
}

这段代码演示如何拦截终止信号。由于设置了 Cancel = true,默认终止动作被取消,程序仍然运行。实际项目需要增加停止标志和退出流程,避免进程一直无法结束。

三、如何测试?

在Linux终端中启动程序:

dotnet MyApp.dll

另一个终端查看进程:

ps -ef | grep MyApp

发送终止信号:

kill -TERM 进程PID

如果已经注册对应信号处理器,程序就可以根据自身逻辑决定是否执行清理和退出。

四、.NET 10需要注意什么?

从.NET 10开始,运行时不再默认为Unix系统安装SIGTERM终止处理器。这意味着某些以前会触发的退出事件,现在可能不会自动触发。官方建议根据应用模型显式处理终止信号,或者使用提供生命周期管理的Host框架。mp.zuluoji.cn/blog/7sFgQz2nDk.html
mp.zuluoji.cn/article/9pRvBm5tXw.html
mp.zuluoji.cn/blog/aS8dJc3hLz.html
mp.zuluoji.cn/article/Kf2gNp7rUy.html
mp.zuluoji.cn/blog/tG5bWq9sAm.html
mp.zuluoji.cn/article/3xZcJh6vRk.html
mp.zuluoji.cn/blog/Yu7nPd2fBg.html
mp.zuluoji.cn/article/Ls9aTm4qXz.html
mp.zuluoji.cn/blog/6rDkFv8jNc.html
mp.zuluoji.cn/article/Bh3wSy5pGt.html
mp.zuluoji.cn/blog/qM2zRc7dAu.html
mp.zuluoji.cn/article/5gJbNk9sFx.html
mp.zuluoji.cn/blog/Pr8vTd3hYm.html
mp.zuluoji.cn/article/zS4aKf7nGw.html
mp.zuluoji.cn/blog/2cXjRb6qDt.html
mp.zuluoji.cn/article/Nu9gWp5sAk.html
mp.zuluoji.cn/blog/Fd7mYz3rBh.html
mp.zuluoji.cn/article/8tQsGc2vJn.html
mp.zuluoji.cn/blog/Rk4bSu7fXa.html
mp.zuluoji.cn/article/Jm6zDp9hLc.html
mp.zuluoji.cn/blog/5wAgNt2qRy.html
mp.zuluoji.cn/article/sK8dFv3bMz.html
mp.zuluoji.cn/blog/Xc2rBh7nGj.html
mp.zuluoji.cn/article/9aTpYs6kDf.html
mp.zuluoji.cn/blog/vN3gQm8wSz.html
mp.zuluoji.cn/article/Db7uRc2tJx.html
mp.zuluoji.cn/blog/4fLyKp9sAh.html
mp.zuluoji.cn/article/Gj5nXz3rBm.html
mp.zuluoji.cn/blog/Tq8dVc7aYu.html
mp.zuluoji.cn/article/hS2wNk6pFg.html
mp.zuluoji.cn/blog/7bRjZm5tQc.html
mp.zuluoji.cn/article/Pu9sDf3gAx.html
mp.zuluoji.cn/blog/nK4vWy8rJh.html
mp.zuluoji.cn/article/2dFgTc7bMz.html
mp.zuluoji.cn/blog/Lz6pRs9aXk.html
mp.zuluoji.cn/article/8mQbNu3hGd.html
mp.zuluoji.cn/blog/cY5rJf7wSt.html
mp.zuluoji.cn/article/Ak2gDn9pVx.html
mp.zuluoji.cn/blog/6sBzRm4qTh.html
mp.zuluoji.cn/article/fJ9vXc3aNg.html
x7k2m.zuluoji.cn
2.  q9v4n.zuluoji.cn
3.  a6p8t.zuluoji.cn
4.  m3r7x.zuluoji.cn
5.  k8w2d.zuluoji.cn
6.  z5n9q.zuluoji.cn
7.  b4t6y.zuluoji.cn
8.  f9j3k.zuluoji.cn
9.  p2x7v.zuluoji.cn
10. h6m4s.zuluoji.cn
11. n8q5r.zuluoji.cn
12. d3v9w.zuluoji.cn
13. t7k2a.zuluoji.cn
14. y4p8m.zuluoji.cn
15. c9x6n.zuluoji.cn
16. w2r5j.zuluoji.cn
17. g8t3q.zuluoji.cn
18. v6n9b.zuluoji.cn
19. j5m7x.zuluoji.cn
20. r3k8p.zuluoji.cn

Microsoft Learn

五、总结

Linux下的C#退出控制不能只依赖Windows控制台事件。对于长期运行的程序,显式注册信号或采用Host生命周期管理,是更清晰的实现方式。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐