调用控制台程序的方法以及注意事项

Posted 张居斜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用控制台程序的方法以及注意事项相关的知识,希望对你有一定的参考价值。

我们常常用遇到调用第三方库,但是该库文件没有做好内存管理,会发生内存泄露的情况。

这个时候我们可以在控制台中调用该库,然后在代码中调用控制台程序,以此控制台的来管理内存。

public class ConsoleMethod
    {
        private static int _time = 10 * 60 * 1000;
        public static string InvokeConsole(string parameter, string programName, string programAddress = null)
        {
            Process cmd = new Process();
            cmd.StartInfo.FileName =programAddress+"\\\\"+programName;

            if (!string.IsNullOrEmpty(programAddress))
            {
                cmd.StartInfo.WorkingDirectory = programAddress;
            }

            //将cmd的标准输入和输出全部重定向到.NET的程序里
            cmd.StartInfo.UseShellExecute = false; //此处必须为false否则引发异常
            //cmd.StartInfo.RedirectStandardInput = true; //标准输入
            cmd.StartInfo.RedirectStandardOutput = true; //标准输出
            cmd.StartInfo.Arguments = parameter; //参数以空格分隔,如果某个参数为空,可以传入””

            //不显示命令行窗口界面
            cmd.StartInfo.CreateNoWindow = true;
            cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            cmd.Start(); //启动进程

            //获取输出
            //需要说明的:此处是指明开始获取,要获取的内容,
            //只有等进程退出后才能真正拿到
            StreamReader streamR = cmd.StandardOutput;
            string result = string.Empty;
            Task.Run(() =>  // 采用异步,读取调用控制台输出结果
            {
                result = cmd.StandardOutput.ReadToEnd();
            });
            bool res = cmd.WaitForExit(_time);//等待控制台程序执行完成
            if (!res)
            {
                cmd.Kill();
                cmd.Dispose();
                return result;
            }
            cmd.Close();//关闭该进程
            cmd.Dispose();//关闭该进程
            return result;
        }
    }

  


控制台应用,有两个地方需要注意:
1.为防止 调用程序 crash 造成线程死锁,需要关闭 werfalut。 如何禁用 werfault
2.为防止输出过大,造成死锁,需要采用异步



以上是关于调用控制台程序的方法以及注意事项的主要内容,如果未能解决你的问题,请参考以下文章

ASP.net MVC 代码片段问题中的 Jqgrid 实现

安卓。片段 getActivity() 有时返回 null

setTimeout

Sleep() 方法后的代码片段没有被执行

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

小程序各种功能代码片段整理---持续更新