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

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

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

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.为防止输出过大,造成死锁,需要采用异步



posted on 2018-05-20 13:18  张居斜  阅读(1228)  评论(0编辑  收藏  举报

导航