博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决Process因缓冲区满而导至进程阻塞的办法
阅读量:5834 次
发布时间:2019-06-18

本文共 1924 字,大约阅读时间需要 6 分钟。

首先我们看一下出现缓冲区写满的做法:

折叠
C# 代码
  1. Process p = CreateProcess("cmd",dir);//假如此处为我们从工厂中实例化一个调用cmd命令的进程   
  2. p.Start();   
  3. //从这里执行一个批处理或控制台程序,也可以是一堆CMD下的命令,我们通常会用这些来做大量的文件拷贝等操作   
  4. p.StandardInput.WriteLine("\"" + filename + "\" " + args);//写入执行参数   
  5. p.StandardInput.WriteLine("exit");//输入退出   
  6. //从此处获取所有输出信息   
  7. string result = p.StandardOutput.ReadToEnd();   
  8. p.WaitForExit();   
  9. //退出  

上面的做法本身没有什么问题,但有二个缺点。

1,如果执行的程序有大量的输出信息,会导致进程阻塞,程序至此不会再跑。

2,如果我要同步获取输出信息也不可能,只能等所有的执行完成才行。

 

下面我们来解决这个问题:

首先定义一个工厂用来生成进程:

折叠
C# 代码
  1.         /// <summary>   
  2.         /// 生成进程   
  3.         /// </summary>   
  4.         /// <param name="filename"></param>   
  5.         /// <returns></returns>   
  6.         public static Process CreateProcess(string filename, string dir)   
  7.         {   
  8.   
  9.             Process p = new Process();//进程   
  10.             p.StartInfo.FileName = filename;   
  11.             p.StartInfo.RedirectStandardOutput = true;   
  12.             p.StartInfo.UseShellExecute = false;   
  13.             p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;   
  14.             p.StartInfo.CreateNoWindow = true;   
  15.            //下面二句不可少,不然会出错   
  16.             p.StartInfo.RedirectStandardInput = true;               
  17.             p.StartInfo.RedirectStandardError = true;   
  18.             if (!string.IsNullOrEmpty(dir))   
  19.                 p.StartInfo.WorkingDirectory = dir;   
  20.   
  21.             return p;   
  22.   
  23.         }   

然后我们调用它生成一个进程:

折叠
C# 代码
  1. Process p = CreateProcess(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System),"cmd.exe"), dir);   
  2.                 StringBuilder result = new StringBuilder();   
  3.   
  4. //这里就是我们用来异步读取输出的二个委托事件   
  5. //一个是正确的信息,另一个是错误的信息输出   
  6. p.ErrorDataReceived += new DataReceivedEventHandler(delegate(object sender, DataReceivedEventArgs e)   
  7.                 {   
  8.                     //也可以是你自义定的其它处理,比如用console.write打印出来等。ShowErrorInfo(e.Data);   
  9.                     result.AppendLine(e.Data);   //收集所有的出错信息                    
  10.                 });   
  11.                 p.OutputDataReceived += new DataReceivedEventHandler(delegate(object sender, DataReceivedEventArgs e)   
  12.                 {   
  13.                     ShowNormalInfo(e.Data);   
  14.                     result.AppendLine(e.Data);                      
  15.                 });   
  16. p.Start();   
  17.   
  18. //这二句别忘了,不然不会触发上面的事件   
  19. p.BeginErrorReadLine();   
  20. p.BeginOutputReadLine();   
  21.   
  22. //可以做你要的操作,执行批处理或其它控制台程序   
  23. //。。。。。。。。。。。   
  24.   
  25. //p.StandardInput.WriteLine(input);   
  26. ///   
  27.   
  28. p.StandardInput.WriteLine("exit");//最后打入退出命令   
  29.   
  30. p.WaitForExit();   
  31. p.Close();   
  32. p.Dispose();  

这样就不怕太多的输出信息阻塞进程了,希望大家有用!

转载地址:http://sxucx.baihongyu.com/

你可能感兴趣的文章
在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库
查看>>
C语言访问网页
查看>>
【Mysql】mysql乐观锁总结和实践
查看>>
模拟示波器功能说明(图文)
查看>>
verilog语法实例学习(8)
查看>>
如何使用istream_iterator將文字檔轉到vector? (C/C++) (STL)
查看>>
艾伟也谈项目管理,创建敏捷团队
查看>>
Linux服务器access_log日志分析及配置详解(一)
查看>>
Pad本蓝牙模块检测
查看>>
QT QDateTime类、QTimer类
查看>>
小程序https Android 安卓可以发request请求,IOS 苹果 发请求失败问题
查看>>
LiteORM学习五:实体类验证
查看>>
xp 网页 flash swf 无法调用 摄像头 问题解决
查看>>
看成功学·谈成功
查看>>
java.io.CharConversionException: isHexDigit
查看>>
Asp.Net在IIS上运行不了,就试下下面方法应该可以你的问题
查看>>
iOS开发中捕获Crash 发送Bug邮件
查看>>
BMP图片转换为JPEG图片
查看>>
codeforces B. Design Tutorial: Learn from Life
查看>>
haproxy配置直接重定向url
查看>>