调用控制台程序的方法以及注意事项
我们常常用遇到调用第三方库,但是该库文件没有做好内存管理,会发生内存泄露的情况。
这个时候我们可以在控制台中调用该库,然后在代码中调用控制台程序,以此控制台的来管理内存。
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.为防止输出过大,造成死锁,需要采用异步