【发布时间】:2018-01-29 01:49:47
【问题描述】:
我有以下简单的代码:
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Process pr = Process.GetCurrentProcess();
pr.EnableRaisingEvents = true;
pr.Exited += HandleClosed;
Console.ReadKey();
}
private static void HandleClosed(object sender, EventArgs e)
{
File.Create(@"C:\MYDIR\myfile.c");
}
}
}
当控制台应用程序退出时,我想创建在HandleClosed 事件中指定的文件。但是,即使我将 EnableRaisingEvents 指定为 true,也不会引发事件 Exited。
有什么建议吗?
附: MSDN 说:
Exited 事件表明相关进程已退出。这个 发生意味着进程终止(中止)或 成功关闭。只有当 EnableRaisingEvents 属性为 true。
关联进程有两种方式得到通知 退出:同步和异步。同步通知 表示调用WaitForExit方法阻塞当前线程直到 进程退出。异步通知使用 Exited 事件, 这允许调用线程同时继续执行。 在后一种情况下,EnableRaisingEvents 必须设置为 true 调用应用程序以接收 Exited 事件。
当操作系统关闭一个进程时,它会通知所有其他进程 已为 Exited 事件注册处理程序的进程。在这 时间,可以使用刚刚退出的进程的句柄来访问 一些属性,如 ExitTime 和 HasExited,操作 系统会一直保持到它完全释放该句柄为止。
所以即使应用程序退出,似乎也可以检测到该事件!
【问题讨论】:
-
我不确定,但是在进程关闭后不会引发 Exited 事件吗?您无法捕捉到该事件,因为它已经升起的时间,您的应用程序已经退出。
-
您要求程序在自己的葬礼上致悼词。
-
我认为问题在于您对事件的句柄之前已释放。当您的应用程序退出时,事件句柄被释放(因此您不再订阅该事件)。然后你的应用程序关闭。之后,Windows 会调用所有订阅的事件处理程序,因为进程已退出。不幸的是,您的句柄已经被释放,因为您的应用程序已经退出。如果你这样解释,MSDN 文档仍然有效。
-
如果它是运行您的代码的进程之外的任何其他进程,那么您最好使用当前的实现。在你的情况下,看看这个答案stackoverflow.com/a/4647168/6205379