news 2026/4/23 19:13:31

win下,当.NET控制台进程被强制终止(如关闭控制台、任务管理器结束进程等)时,如何优雅地清理数据

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
win下,当.NET控制台进程被强制终止(如关闭控制台、任务管理器结束进程等)时,如何优雅地清理数据

win下,当.NET控制台进程被强制终止(如关闭控制台、任务管理器结束进程等)时,如何优雅地清理数据

在Windows下,当.NET控制台进程被强制终止时,优雅地清理数据是一个挑战。以下是几种处理方案,按推荐程度排序:

1.最佳方案:结合多种事件处理

usingSystem;usingSystem.Runtime.InteropServices;usingSystem.Threading;classProgram{// Windows API 定义[DllImport("Kernel32")]privatestaticexternboolSetConsoleCtrlHandler(EventHandlerhandler,booladd);privatedelegateboolEventHandler(CtrlTypesig);privatestaticEventHandler_handler;enumCtrlType{CTRL_C_EVENT=0,CTRL_BREAK_EVENT=1,CTRL_CLOSE_EVENT=2,CTRL_LOGOFF_EVENT=5,CTRL_SHUTDOWN_EVENT=6}privatestaticboolConsoleCtrlCheck(CtrlTypectrlType){Console.WriteLine($"接收到关闭信号:{ctrlType}");Cleanup();returntrue;// 返回true表示已处理}staticvoidMain(string[]args){// 注册控制台控制事件处理器_handler+=newEventHandler(ConsoleCtrlCheck);SetConsoleCtrlHandler(_handler,true);// 注册进程退出事件AppDomain.CurrentDomain.ProcessExit+=(s,e)=>Cleanup();// 注册AppDomain卸载事件AppDomain.CurrentDomain.DomainUnload+=(s,e)=>Cleanup();// 对于需要取消的循环操作,使用CancellationTokenvarcts=newCancellationTokenSource();Console.CancelKeyPress+=(sender,e)=>{Console.WriteLine("Ctrl+C 被按下");e.Cancel=true;// 防止立即退出cts.Cancel();Cleanup();};try{// 主程序逻辑RunApplication(cts.Token);}finally{// 正常退出时的清理Cleanup();}}staticvoidRunApplication(CancellationTokentoken){// 示例:使用CancellationToken来响应取消请求while(!token.IsCancellationRequested){Console.WriteLine("程序运行中... 按Ctrl+C退出");Thread.Sleep(1000);}}staticvoidCleanup(){// 使用标志避免重复清理if(_isCleaned)return;_isCleaned=true;try{Console.WriteLine("开始清理资源...");// 1. 保存数据到文件SaveCriticalData();// 2. 关闭数据库连接等资源CloseDatabaseConnections();// 3. 释放文件锁等ReleaseFileLocks();// 4. 记录日志LogShutdown();Console.WriteLine("清理完成");// 等待所有异步操作完成Thread.Sleep(500);// 给清理操作一点时间}catch(Exceptionex){Console.WriteLine($"清理过程中发生错误:{ex.Message}");}}privatestaticbool_isCleaned=false;// 示例清理方法staticvoidSaveCriticalData(){try{// 保存关键数据到文件File.WriteAllText("backup.txt",DateTime.Now.ToString());}catch{/* 忽略错误 */}}staticvoidCloseDatabaseConnections(){// 关闭数据库连接}staticvoidReleaseFileLocks(){// 释放文件锁}staticvoidLogShutdown(){// 记录关闭日志}}

2.备用方案:使用子进程监控

对于无法捕获的终止(如任务管理器强制结束),可以创建一个监控进程:

// 监控程序(父进程)classMonitorProgram{staticvoidMain(){varprocess=newProcess{StartInfo=newProcessStartInfo{FileName="YourConsoleApp.exe",UseShellExecute=false}};process.Start();// 监控子进程退出process.WaitForExit();// 子进程退出后执行清理if(process.ExitCode!=0){PerformEmergencyCleanup();}}staticvoidPerformEmergencyCleanup(){// 紧急清理逻辑}}

3.防御性编程策略

3.1 定期保存状态

classProgramWithAutoSave{privatestaticTimer_autoSaveTimer;privatestaticreadonlyobject_saveLock=newobject();staticvoidMain(){// 每隔5分钟自动保存_autoSaveTimer=newTimer(_=>{lock(_saveLock){SaveCurrentState();}},null,TimeSpan.Zero,TimeSpan.FromMinutes(5));// 主程序逻辑}staticvoidSaveCurrentState(){// 保存当前状态到临时文件vartempFile=$"autosave_{DateTime.Now:yyyyMMddHHmmss}.tmp";// ... 保存逻辑}}

3.2 使用文件锁确保数据一致性

classProgramWithFileLock{privatestaticFileStream_lockFile;staticvoidMain(){try{// 创建锁文件_lockFile=File.Open("app.lock",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);// 程序主逻辑RunProgram();}finally{_lockFile?.Close();File.Delete("app.lock");}}staticvoidCheckForPreviousCrash(){if(File.Exists("app.lock")){// 上次程序异常退出RecoverFromCrash();}}}

4.Windows服务替代方案

如果可靠性要求很高,考虑使用Windows服务:

usingSystem.ServiceProcess;publicclassMyService:ServiceBase{protectedoverridevoidOnStart(string[]args){// 启动逻辑}protectedoverridevoidOnStop(){// 优雅停止Cleanup();}protectedoverridevoidOnShutdown(){// 系统关机时调用Cleanup();base.OnShutdown();}}

5.重要注意事项

  1. 清理时间限制:Windows在进程终止时只给大约30秒的时间进行清理
  2. 避免阻塞操作:清理操作应该快速完成
  3. 幂等性设计:清理操作应该可以安全地重复执行
  4. 关键数据立即持久化:重要数据应该立即写入磁盘,而不是缓存在内存中

推荐的最佳实践组合:

// 简化的最佳实践示例classRobustConsoleApp{staticvoidMain(){// 1. 设置控制台事件处理器SetConsoleHandlers();// 2. 检查上次是否异常退出CheckForCrashRecovery();// 3. 使用using确保资源释放using(varcriticalResource=newCriticalResource())using(varcts=newCancellationTokenSource()){// 4. 设置取消令牌Console.CancelKeyPress+=(s,e)=>{e.Cancel=true;cts.Cancel();};// 5. 主程序循环try{MainLoop(cts.Token);}finally{Cleanup();}}}}

重要提示:没有任何方法可以100%保证在强制终止时执行清理代码。最好的策略是:

  1. 设计应用程序使其可以容忍突然终止
  2. 定期保存状态到持久化存储
  3. 提供崩溃恢复机制
  4. 使用事务性操作保证数据一致性
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 14:41:11

亲测好用!专科生毕业论文必备的8款一键生成论文工具测评

亲测好用!专科生毕业论文必备的8款一键生成论文工具测评 专科生论文写作的痛点与测评思路 随着高校教育的不断普及,越来越多的专科生面临毕业论文撰写的压力。在实际操作中,许多学生会遇到选题困难、资料查找繁琐、格式不规范、语言表达不够专…

作者头像 李华
网站建设 2026/4/23 13:04:27

医疗行业数字化转型:AI智能体辅助诊疗系统的架构设计与合规实践

医疗行业数字化转型:AI智能体辅助诊疗系统的架构设计与合规实践 元数据框架 标题:医疗行业数字化转型:AI智能体辅助诊疗系统的架构设计与合规实践 关键词:医疗数字化转型、AI辅助诊疗系统、临床决策支持、医疗数据治理、FDA医疗AI合规、HL7 FHIR集成、可解释人工智能(XA…

作者头像 李华
网站建设 2026/4/23 15:47:44

mysql如何发现慢查询sql

在 MySQL 中可以通过以下几种方式发现慢查询 SQL: 一、开启慢查询日志 配置参数:在 MySQL 的配置文件(如 my.cnf 或 my.ini)中设置以下参数来开启慢查询日志。plaintext 复制 slow_query_log 1 long_query_time 2 # 设置慢查询时…

作者头像 李华
网站建设 2026/4/23 14:27:46

AI的发展会促成共同富裕加速发展全行业的底层基础设施升级

AI的发展会促成共同富裕加速发展全行业的底层基础设施升级兄弟们,我从技术视角把这事捋一遍——为什么我(卓伊凡)一直说:AI 会加速促成共同富裕。先说结论:AI 不是“某个行业的工具”,它是“全行业的底层基…

作者头像 李华
网站建设 2026/4/22 18:40:14

计算机深度学习毕设实战-通过python_CNN卷积神经网络对辣椒类别识别

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华