C# - 是否可以捕获从主进程触发的<process> .Exited事件?</process>

时间:2011-07-20 14:04:48

标签: c# events process

我正在编写一个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);

它似乎永远不会激发,不是当程序自然结束时,而不是当我单击关闭按钮时......从不。这甚至可能吗?

6 个答案:

答案 0 :(得分:8)

这不起作用;一旦流程结束,您的代码已消失

处理AppDomain.ProcessExit event

答案 1 :(得分:5)

进程退出事件应该在进程退出后以逻辑方式触发,因此无法捕获它自己的退出。

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

答案 2 :(得分:2)

使用

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

答案 3 :(得分:1)

仅对关联进程和终止后调用Process.Exit。 尝试使用当前AppDomain的ProcessExit事件。

答案 4 :(得分:1)

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

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!");
    }
}

答案 5 :(得分:0)

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

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