【发布时间】:2011-04-20 20:23:58
【问题描述】:
我正在开发一个 .NET 控制台应用程序,该应用程序需要在退出时清理资源。我遇到的问题是,如果通过控制台窗口 [X]、任务管理器/进程资源管理器或使用 WM_CLOSE 以编程方式关闭 cmd 父级,我不会收到任何通知。我可以忍受无法处理来自 Task Mgr 的 Kill Process。或 ProcExp。父控制台的 WM_CLOSE 是此应用程序在完成处理之前关闭的最有可能的方式。
以下是我目前尝试注册的活动:
AppDomain.CurrentDomain.ProcessExit += CurrentDomainProcessExit;
AppDomain.CurrentDomain.UnhandledException += CurrentDomainUnhandledException;
Console.CancelKeyPress += ConsoleCancelKeyPress;
Application.ApplicationExit += ApplicationApplicationExit;
Process parentProcess = ProcessInfo.GetParentProcess(
Process.GetCurrentProcess());
parentProcess.Disposed += ParentDisposed;
parentProcess.Exited += ParentExited;
Process grandParentProcess = ProcessInfo.GetParentProcess(parentProcess);
grandParentProcess.Disposed += GrandParentDisposed;
grandParentProcess.Exited += GrandParentExited;
当我从控制台发送 CTRL+C 或应用程序不间断地完成时,这些事件会正确触发。但是当父应用程序(cmd 控制台)关闭时,它们都不会触发。 (父/祖父进程不是 CLR,所以我不确定我是否会收到那些 Disposed/Exited 事件。这些只是在黑暗中拍摄。)我看过一些 pInvoke 的东西,但我宁愿不下去如果.NET 是一个选项,那条路。
有没有办法在这些情况下检测和处理关机?我对任何 .NET、pInvoke/Win32/C/C++ 解决方案持开放态度。 (基本上任何方式都可以在 Windows 平台上完成。)
谢谢。
附:我仍在使用 .NET 2.0,因此无法使用 .NET 3.0+ 中引入的任何内容
【问题讨论】:
-
需要清理哪些资源,需要进行哪些清理工作?
-
您说父级是控制台应用程序,但后来您提到了 WM_CLOSE。父级是控制台应用程序(在这种情况下它没有窗口)还是窗口应用程序(在这种情况下您可以向它发送 WM_CLOSE)?
-
@John:该进程执行其他作业,如果它过早停止,我需要停止这些作业。否则,子作业将被孤立并在没有生成过程的情况下运行完成。
-
@Gabe:控制台窗口本身可以接受 WM_CLOSE 并关闭。我从那个控制台开始的进程也被关闭了。
-
@Paul:我认为如果子进程完成父进程在父进程不再在那里观看时启动的进程是一件坏事?我的建议是 - 让父级永远不会停止 - 将其设为 Windows 服务,它具有启动和停止的正式概念。