c# -有可能捕获一个吗?从主进程触发的退出事件

本文关键字:进程 出事件 退出 Process 有可能 一个 | 更新日期: 2023-09-27 18:03:08

我正在编写一个c#控制台应用程序,并试图检查我的主程序进程何时退出,以便我可以在退出之前做一些清理,但事件似乎从未触发。下面是设置事件处理程序的代码:

Process process = Process.GetCurrentProcess();
CloseConsoleHandler close = new CloseConsoleHandler(test);
process.EnableRaisingEvents = true;
process.Exited += close.CloseHandler; 
//I also tried process.Exited += new EventHandler(close.CloseHandler);

它似乎永远不会触发,不是当程序自然结束,不是当我点击关闭按钮…从来没有。这可能吗?

c# -有可能捕获一个<Process>吗?从主进程触发的退出事件

不行;一旦这个过程结束,你的代码就消失了。

处理AppDomain.ProcessExit事件

进程exit 事件应该在进程退出后逻辑上触发,因此不可能捕获它自己的退出。

但是还有其他的选择,比如在你的类中实现Dispose来做清理,或者由于某种原因你需要Process exit事件,只是从另一个进程监视进程。

使用

        Process p = new Process();
        p.EnableRaisingEvents = true;

您可以向processsexit事件添加一个自定义处理程序,并在那里进行清理。例如:

class Program
{
    static void Main(string[] args)
    {
        // Register hanlder to ProcessExit event
        AppDomain.CurrentDomain.ProcessExit += ProcessExitHanlder;
    }
    private static void ProcessExitHanlder(object sender, EventArgs e)
    {
        Console.WriteLine("Cleanup!");
    }
}

流程。Exit仅在关联进程终止后调用。

或者你可以尝试在应用程序级别解决这个问题,如果你也拥有主应用程序(听起来像):当主应用程序关闭时,用一些技术从主应用程序发出信号给子进程。也许这次我应该尝试同步发出信号,这样主应用程序就有时间给子应用程序清理。不过这种方法也有它自己的缺点。理想的情况是在子进程中捕获一些系统事件。

有两种方法-根据您的偏好,一种p/Invoke方法(参见http://osdir.com/ml/windows.devel.dotnet.clr/2003-11/msg00214.html)…这将调用一个委托,你在退出应用程序时在一个单独的线程中定义,并与控制台一起工作…

另一种方法是AppDomain.ProcessExit -它有一个允许运行的时间限制(默认3秒)