news 2026/5/14 3:49:15

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/5/9 8:02:35

空间计算开发者技能指南 2026

空间计算时代的来临:定义、生态与技术共振 “空间计算”(Spatial Computing)不仅仅是营销术语,它标志着计算平台从二维屏幕向三维物理空间的范式转移。虽然 Apple 将 visionOS 定义为空间计算操作系统,但在更广泛的开…

作者头像 李华
网站建设 2026/5/10 7:09:18

如何为我们的GPU设备选择合适的CUDA版本和Torch版本?

文章目录Torch版本和CUDA版本需要匹配对应(⚠️非常重要!)如何为我们的GPU设备选择合适的CUDA版本和Torch版本?1,先明确我们使用的是什么GPU?2,根据使用的GPU,在Nvidia官网查找对应的…

作者头像 李华
网站建设 2026/5/12 10:30:24

深度学习毕设项目:通过python_CNN卷积神经网络对辣椒类别识别

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

作者头像 李华
网站建设 2026/5/14 0:44:51

C/C++中一次性执行多个DOS命令

起因最近给公司的一个系统写了个启动的脚本,但是领导说批处理这样的脚本太low了,要使用EXE来启动,未来还要使用加密工具对EXE进行加密。好吧,我就在网上到处找bat转exe的工具,找了很久,都没有找到合适的&am…

作者头像 李华
网站建设 2026/5/9 22:12:51

AI应用架构师必备:品牌价值量化评估的成本控制策略,降本增效

AI应用架构师必备:品牌价值量化评估的成本控制策略——用"技术算盘"算出品牌的"真金白银" 关键词 品牌价值量化、AI应用架构、成本控制、降本增效、机器学习模型、数据策略、资源优化 摘要 当企业CEO拿着品牌营销预算表问你:“我们花…

作者头像 李华
网站建设 2026/5/9 23:58:34

亲测好用10个一键生成论文工具,MBA论文写作必备!

亲测好用10个一键生成论文工具,MBA论文写作必备! AI 工具如何助力论文写作,让效率翻倍 在 MBA 学习过程中,论文写作是每一位学生必须面对的重要环节。无论是开题报告、研究设计还是最终的论文撰写,都对逻辑性、专业性和…

作者头像 李华