解决Process因缓冲区满而导至进程阻塞的办法,监控并及时显示另一个Console的输出
https://bbs.csdn.net/topics/370078749
看到有同学写【C# 如何监控并及时的显示另一个控制台Console的输出】
想到我其实早期也写过这东东。只是没有到这边发过。就转过来给大家参考下。个人感觉此方法更可取
首先我们看一下出现缓冲区写满的做法:
C# code?
1 2 3 4 5 6 7 8 9 |
|
上面的做法本身没有什么问题,但有二个缺点。
1,如果执行的程序有大量的输出信息,会导致进程阻塞,程序至此不会再跑。
2,如果我要同步获取输出信息也不可能,只能等所有的执行完成才行。
下面我们来解决这个问题:
首先定义一个工厂用来生成进程:
C# code?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
然后我们调用它生成一个进程:
Process p = CreateProcess(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System),"cmd.exe"), dir);
StringBuilder result = new StringBuilder();
//这里就是我们用来异步读取输出的二个委托事件
//一个是正确的信息,另一个是错误的信息输出
p.ErrorDataReceived += new DataReceivedEventHandler(delegate(object sender, DataReceivedEventArgs e)
{
//也可以是你自义定的其它处理,比如用console.write打印出来等。ShowErrorInfo(e.Data);
result.AppendLine(e.Data); //收集所有的出错信息
});
p.OutputDataReceived += new DataReceivedEventHandler(delegate(object sender, DataReceivedEventArgs e)
{
ShowNormalInfo(e.Data);
result.AppendLine(e.Data);
});
p.Start();
//这二句别忘了,不然不会触发上面的事件
p.BeginErrorReadLine();
p.BeginOutputReadLine();
//可以做你要的操作,执行批处理或其它控制台程序
//。。。。。。。。。。。
//p.StandardInput.WriteLine(input);
///
p.StandardInput.WriteLine("exit");//最后打入退出命令
p.WaitForExit();
p.Close();
p.Dispose();
这样就不怕太多的输出信息阻塞进程了,希望大家有用!
原文地址:http://www.jm47.com/document/1031
2011-07-20 15:17:19
楼主
等级
这个好啊。更合理