news 2026/6/15 20:13:04

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/6/15 16:00:12

原来写英语论文涉及到这些问题都会被认定为学术不端啊!

近几年学术圈对于学术不端行为是严重的打压,无论是毕业论文还是小论文发表,只要出现了学术不端的行为,就将受到相应的惩罚。 同学们在写英文论文过程中,具体哪些行为属于学术不端行为呢? 主要表现有以下几个方面&…

作者头像 李华
网站建设 2026/6/15 13:25:59

最新APP导航下载页系统源码 带后台

非常好看的一款App导航推荐页源码,带后台,这是一款PHP源码,Thinkphp框架,这款源码安装非常便捷干净,后台添加应用及轮播广告也非常方便,网站自适应PC手机自适应,喜欢的自行部署吧!安…

作者头像 李华
网站建设 2026/6/15 13:25:59

【毕业设计】通过python_CNN卷积神经网络对鸡蛋是否破损识别

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

作者头像 李华
网站建设 2026/6/15 13:25:57

【毕业设计】通过python_CNN卷积神经网络对辣椒类别识别

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

作者头像 李华
网站建设 2026/6/15 14:32:56

【课程设计/毕业设计】通过python_CNN卷积神经网络对辣椒类别识别

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

作者头像 李华
网站建设 2026/6/15 13:26:07

历年CSP-S复赛真题解析 | 2011年T2 选择客栈

​欢迎大家订阅我的专栏:算法题解:C与Python实现! 本专栏旨在帮助大家从基础到进阶 ,逐步提升编程能力,助力信息学竞赛备战! 专栏特色 1.经典算法练习:根据信息学竞赛大纲,精心挑选…

作者头像 李华