下面代码中p和reader那个先调用close()有关系吗?我感觉应该先调用reader的,因为reader引用了p的资源,可是在网上找几个例子都是先调用p的close(),不知先后顺序有没有关系,请各位指教
tbResult.Text = "";
ProcessStartInfo start = new ProcessStartInfo("Ping.exe");//设置运行的命令行文件问ping.exe文件,这个文件系统会自己找到
//如果是其它exe文件,则有可能需要指定详细路径,如运行winRar.exe
start.Arguments = txtCommand.Text;//设置命令参数
start.CreateNoWindow = true;//不显示dos命令行窗口
start.RedirectStandardOutput = true;//
start.RedirectStandardInput = true;//
start.UseShellExecute = false;//是否指定操作系统外壳进程启动程序
Process p = Process.Start(start);
StreamReader reader = p.StandardOutput;//截取输出流
tbResult.Text = reader.ReadToEnd();
string line = reader.ReadLine();//每次读取一行
while (!reader.EndOfStream)
{
tbResult.AppendText(line + "\r\n");
line = reader.ReadLine();
}
p.WaitForExit();//等待程序执行完退出进程
p.Close();//关闭进程
reader.Close();//关闭流
先reader的话p还在活着,会不会reader不到报错?这个有神马区别?坐等答案。。
最后打开的最先关闭,相当于你走进有很多重门的房子,出来时要从最里面开始关门
哦,想起来了,有这么一说,不过还是不太理解
p和reader之间是有关系的,感觉reader应该是后打开的,不是应该先关闭吗?能不能从对象生命周期上讲解下先后关闭的原因,谢谢
@bzhibjue:博客园问题补充页面报脚本错误,只能在这里补充了
ProcessStartInfo start = new ProcessStartInfo("Ping.exe");
start.Arguments = "-n 1 127.0.0.1";
start.CreateNoWindow = true;
start.UseShellExecute = false;
start.RedirectStandardInput = true;
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
Process p = Process.Start(start);
StreamReader reader = p.StandardOutput;
p.Dispose(); //先销毁
MessageBox.Show(reader.ReadToEnd()); //还可以读到数据
reader.Close();
验证发现,即使先将p销毁后再reader也能读到数据,说明reader不是p.StandardOutput的引用,而是p.StandardOutput的深拷贝,赋值后reader和p就没有任何关系了
不知是否可以这样理解,请各位指教
谢谢关注
自己觉得应该是这样:将进程的StandardOutput赋值给外部的StreamReader流后,流和进程就没有关系了,所以那个先关闭都一样。
之前可能错误的把流理解为一个过程了,所以才会有这种疑问。其实流也只是一个对象,自己决定自己,和外部没有关系