【问题标题】:C# child process behaviour after parent crash父崩溃后的 C# 子进程行为
【发布时间】:2017-12-11 10:09:13
【问题描述】:

我有一个简单而有趣的问题。

我需要从 C# 应用程序启动一个进程(node.js 服务器)。

我找到了一段代码,解释了如何从应用程序中启动服务器。

 Process p = new Process();
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.FileName = @"c:\node\node.exe";**//Path to node installed folder****
        string argument = "\\ bundle\main.js";
        p.StartInfo.Arguments = @argument;
        p.Start();

我的问题是:如果父进程(C# 应用程序)崩溃,这个进程会发生什么?子进程会退出/崩溃还是会继续运行,因为它是一个完全独立的程序?

在它继续运行的情况下,有没有办法“链接”这两个进程以确保在父进程崩溃时子进程退出?

【问题讨论】:

    标签: c# server multiple-processes


    【解决方案1】:

    试过你的代码如下,如果你想关闭你的进程,你必须使用这个函数process.CloseMainWindow();这将关闭你启动的进程。

    public static void Main()
    {    
         System.Diagnostics.Process process = new System.Diagnostics.Process();
         System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
        startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
         startInfo.FileName = "cmd.exe";
         process.StartInfo = startInfo;
         process.Start();
         Console.ReadLine();
         process.CloseMainWindow();
         process.Close();
    }
    

    在上面的代码中,我启动了cmd.exe,因为它有自己的窗口,所以我编写了CloseMainWindow()函数来关闭该程序。

    由于 Cmd 是单独的进程,当您关闭启动它的程序时它不会关闭。

    如果父进程崩溃(在 process.CloseMainWindow(); 之前),这个进程会继续运行吗?

    问题的答案是:如果父级在调用 CloseMainWindow 之前关闭,Cmd 进程将不会关闭

    试试这个检查一下

    public static void Main()
        {
            System.Diagnostics.Process process = new System.Diagnostics.Process();
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
            startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Normal;
            startInfo.FileName = "cmd.exe";
            process.StartInfo = startInfo;
            process.Start();
            throw new Exception("test");
            Console.ReadLine();
            process.CloseMainWindow();
            process.Close();
    }
    

    在上面的代码中,主程序出现异常,它在关闭子进程之前创建,然后在这种情况下子进程将运行。

    如果你想在应用程序关闭时强行关闭外部启动的进程,而不是使用Application.ApplicationExit Event,并调用外部进程对象的CloseMainWindow()函数。

    【讨论】:

    • 谢谢你,但我的问题仍然存在:如果父进程崩溃(在 process.CloseMainWindow(); 之前),这个进程会继续运行吗?如果是这样,如果发生这种情况,有办法关闭它吗?
    • @ThomasGros - 没有进程没有关闭...更新的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2012-12-17
    • 1970-01-01
    • 2021-03-02
    • 2012-04-16
    相关资源
    最近更新 更多