0

我似乎用以下代码创建了一个“不朽”的过程:

System.Diagnostics.ProcessStartInfo test = new ProcessStartInfo("cmd", " /c " + aCommandLine); //aCommandLine is : ruby test.rb
test.CreateNoWindow = true;
test.RedirectStandardError = true;
test.RedirectStandardOutput = true;
test.UseShellExecute = false;
test.WorkingDirectory = System.IO.Path.GetDirectoryName(aRTextFilePath);
System.Diagnostics.Process aProcess = Process.Start(test);
aProcess.EnableRaisingEvents = true;
aProcess.Exited += new EventHandler(aProcess_Exited);
try
{
    //read synchronously to get the port number
    string aPortInformationLine = aProcess.StandardOutput.ReadLine();
    if (!aProcess.HasExited)
    {
        aProcess.Kill();
        Debug.Print("Process Has Exited");
    }
    //return true;
    errorOut = String.Format("Could not start process with command line : {0} from .rtext file {1}", aCommandLine, aRTextFilePath);
    port = -1;
    return false;
}
catch (Win32Exception ex)
{
    Debug.WriteLine(ex.NativeErrorCode.ToString());
    errorOut = String.Format("Could not start process with command line : {0} from .rtext file {1}. Error : {2}", aCommandLine, aRTextFilePath, ex.NativeErrorCode.ToString());
}
catch (Exception ex)
{
    Debug.WriteLine(ex.Message);
    errorOut = String.Format("Could not start process with command line : {0} from .rtext file {1}. Error : {2}", aCommandLine, aRTextFilePath, ex.Message);
}

所以我使用 cmd 来启动某种红宝石服务器。该过程开始,我能够从新创建的过程中读取输出。但是,当执行 kill 命令时,不会抛出异常,但 ruby​​ 进程不会死亡。

这与使用 cmd 有什么关系吗?我做错了什么吗?谢谢

编辑:

我使用进程资源管理器并在杀死前后拍了两张照片:

前:

杀前 后:

杀戮之后

因此,当 cmd.exe 死亡时,ruby 以某种方式设法继续并活着看到另一天..

编辑2:

回答我的问题:在 C# 中以编程方式杀死进程树

4

3 回答 3

1

您希望杀死命令处理器也会杀死任何由它启动的进程,这是一个空闲进程,Windows 就是不能那样工作。Windows 中有一种机制,工作对象,但你不想去那里。根本不要使用 cmd.exe,它不会增加任何价值。直接启动ruby.exe。

于 2012-11-17T14:19:00.953 回答
0

来自 MSDN:

Kill 方法异步执行。调用Kill方法后,调用WaitForExit方法等待进程退出,或者查看HasExited属性判断进程是否退出。

于 2012-11-17T11:42:07.130 回答
0

请检查进程是否有任何未声明为后台线程的线程。而且那个过程可能有任何无限循环..

于 2012-11-17T12:14:46.487 回答