1. 程式人生 > >調用控制臺程序的方法以及註意事項

調用控制臺程序的方法以及註意事項

標準輸出 int 完成 程序 star tin output 沒有 isnull

我們常常用遇到調用第三方庫,但是該庫文件沒有做好內存管理,會發生內存泄露的情況。

這個時候我們可以在控制臺中調用該庫,然後在代碼中調用控制臺程序,以此控制臺的來管理內存。

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.為防止輸出過大,造成死鎖,需要采用異步



調用控制臺程序的方法以及註意事項