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