首页 新闻 会员 周边 捐助

.net中.流和进程哪个应该先关闭

0
悬赏园豆:20 [已关闭问题] 关闭于 2011-09-19 10:13

            下面代码中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();//关闭流

wangd的主页 wangd | 初学一级 | 园豆:75
提问于:2011-09-01 09:39
< >
分享
所有回答(3)
0

先reader的话p还在活着,会不会reader不到报错?这个有神马区别?坐等答案。。

Rookier | 园豆:652 (小虾三级) | 2011-09-01 09:55
0

最后打开的最先关闭,相当于你走进有很多重门的房子,出来时要从最里面开始关门

artwl | 园豆:16736 (专家六级) | 2011-09-01 10:07

哦,想起来了,有这么一说,不过还是不太理解

p和reader之间是有关系的,感觉reader应该是后打开的,不是应该先关闭吗?能不能从对象生命周期上讲解下先后关闭的原因,谢谢

支持(0) 反对(0) wangd | 园豆:75 (初学一级) | 2011-09-01 13:17

@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就没有任何关系了
不知是否可以这样理解,请各位指教

支持(0) 反对(0) wangd | 园豆:75 (初学一级) | 2011-09-06 00:06
0

谢谢关注

自己觉得应该是这样:将进程的StandardOutput赋值给外部的StreamReader流后,流和进程就没有关系了,所以那个先关闭都一样。

之前可能错误的把流理解为一个过程了,所以才会有这种疑问。其实流也只是一个对象,自己决定自己,和外部没有关系

wangd | 园豆:75 (初学一级) | 2011-09-19 10:12
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册