【问题标题】:Process.Exited event is never raisedProcess.Exited 事件永远不会引发
【发布时间】: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

标签: c# process


【解决方案1】:

正如所有 cmets 建议的那样,您不能在同一个应用程序中处理您的应用程序的 Exited退出意味着它已经发生,因此没有更多的用户代码可以执行)

但是,有一些方法可以在控制台应用程序 as suggested here 中处理此问题。

【讨论】:

  • 看来有道理我去看看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-20
  • 2016-09-07
  • 2011-11-19
  • 1970-01-01
  • 2020-10-14
  • 2020-12-05
相关资源
最近更新 更多