C#Process启动应用后卡死无响应解决方法

C#代码中使用Process类启动第三方应用,第三方应用在运行一段时间之后无响应或卡死,原因是因为复制了网上的代码,重定向了输入输出流,这时如果第三方应用在不断输出数据,而你的C#程序却没能及时读出来,缓冲区被填满时,第三方应用就会停止运行,产生无响应的情况。

遇到这种情况有两种办法,一是如果第三方应用输出的数据对你来说是不重要的,没有用的,你只是想启动它而不需要通讯,那你完全可以不去定义输出流,如下面代码,将重定向输出流的这行代码注释掉,程序就不再卡死了,非常简单。

Process process = new Process();
process.StartInfo.FileName = @"cmd";                //打开cmd
process.StartInfo.UseShellExecute = false;          //不使用系统外壳程序启动,重定向输入输出的话必须设为false
process.StartInfo.RedirectStandardInput = true;     //重定向输入流
//process.StartInfo.RedirectStandardOutput = true;    //重定向输出流 
process.StartInfo.CreateNoWindow = true;            //不创建窗口运行
process.Start();                                    //开始运行程序

第二种方法也很简单,给Process 绑定一个数据接收的事件,在每次接收到数据时将它读出来,进行处理,这样第三方应用的数据就不会一直留在缓冲区,缓冲区数据不会溢出,应用也就不会再卡死了。

Process process = new Process();
process.StartInfo.FileName = @"cmd";                //打开cmd
process.StartInfo.UseShellExecute = false;          //不使用系统外壳程序启动,重定向输入输出的话必须设为false
process.StartInfo.RedirectStandardInput = true;     //重定向输入流
process.StartInfo.RedirectStandardOutput = true;    //重定向输出流 
process.StartInfo.CreateNoWindow = true;            //不创建窗口运行
process.ErrorDataReceived += new DataReceivedEventHandler(delegate (object sender, DataReceivedEventArgs e) { });
process.Start();                                    //开始运行程序
process.BeginOutputReadLine();                      //开始读取消息

数据接收事件这样写:

private void OutputHandler(object sender, DataReceivedEventArgs outLine)
{
    if (!String.IsNullOrEmpty(outLine.Data))
    {
        //你的数据处理
    }
}

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

XX_YYDS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值