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))
    {
        //你的数据处理
    }
}

更多推荐

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