我似乎用以下代码创建了一个“不朽”的过程:
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来启动某种类型的ruby服务器。该过程开始,我能够从新创建的进程中读取输出。但是,当执行kill命令时,不会抛出任何异常,但ruby进程不会死亡。
这与使用cmd有什么关系吗?我做错了什么吗?感谢
修改
我使用了进程资源管理器并在kill之前和之后拍了2张照片:
在:
后:
因此,当cmd.exe死亡时,ruby以某种方式设法继续生活,看到另一天......
EDIT2:
答案 0 :(得分:1)
你希望杀死命令处理器也会杀死它启动的任何进程是一个空闲的,Windows就是这样不行。在Windows中有一种机制,作业对象,但你不想去那里。只是不要使用cmd.exe,它不会添加任何值。直接启动ruby.exe。
答案 1 :(得分:0)
来自MSDN:
Kill方法异步执行。在调用Kill方法之后,调用WaitForExit方法以等待进程退出,或者检查HasExited属性以确定进程是否已退出。
答案 2 :(得分:0)
请检查进程是否有任何未声明为后台线程的线程。而且这个过程可能有任何无限循环..