父崩溃后的C#子进程行为

时间:2017-12-11 10:09:13

标签: c# server multiple-processes

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

我需要从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#应用程序)崩溃,该进程会发生什么?孩子会处理退出/崩溃,还是会继续运行,因为它是一个完全独立的程序?

在它继续运行的情况下,是否有办法链接"如果父母崩溃,那两个进程是为了确保孩子退出?

1 个答案:

答案 0 :(得分:0)

尝试使用如下代码,如果你想关闭你的过程,你必须使用这个函数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()函数。