我們在用C#調用執行exe文件時有個細節問題特別容易忽視,我先將把代碼粘貼過來講一講吧,如下:
事先說明一下,resultFilePath是一個txt文本文件路徑,用來將exe執行後的數據保存到resultFilePath中;tempFilePath 是原始數據文件路徑,也是txt文本文件,就是exe程序需要處理的數據文件;而exeFilePath是一個exe可執行文件路徑,用C語言寫的一個算法,這個算法程序需要兩個參數,就是原始數據文件路徑以及保存結果的文件路徑,即tempFilePath 和 resultFilePath;執行完exe文件後需要將resultFilePath中生成的新數據讀入到一個DataTable的變量中以顯示到界面上,部分代碼如下:
private void analyseData(DataTable resultDataTable, string resultFilePath)
{
try
{
string exeFilePath = null;
string tempFilePath = this.txtFilePath.Text.Trim();
exeFilePath = Application.StartupPath + "//Command//ttest.exe";
// 執行exe文件
Process process = new Process();
process.StartInfo.FileName = exeFilePath;
// 不顯示閃爍窗口
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
// 注意,參數需用引號括起來,因爲路徑中可能有空格
process.StartInfo.Arguments = "/"" + tempFilePath + "/" /"" + resultFilePath + "/"";
process.Start();
// 將resultFilePath 文件中的數據讀入到DataTable中
readDataFile(resultDataTable, resultFilePath);
}
catch (IOException ioEx)
{
throw ioEx;
}
catch (Exception ex)
{
throw ex;
}
}
對於上面這段程序我們初一看,似乎沒有什麼問題,但是你如果將這段代碼執行一下,你就知道有問題了。當時我執行程序之後每次發現用readDataFile()方法讀取的resultFilePath文件中的數據都是上一次執行exe文件後生成的結果,但是我打開resultFilePath文件發現裏面的數據是exe文件處理的新數據結果,但是新數據沒有被讀入到DataTable中,DataTable中卻存的是上一次執行的結果,再看看我寫的代碼將讀數據的方法放在執行exe文件的代碼之後了,按程序指令執行的順序來看應該沒有錯誤啊,當時很納悶很不解很迷惑!
後來終於發現問題所在,看看下面的改進過的代碼吧:
private void analyseData(DataTable resultDataTable, string resultFilePath)
{
try
{
string exeFilePath = null;
string tempFilePath = this.txtFilePath.Text.Trim();
exeFilePath = Application.StartupPath + "//Command//ttest.exe";
// 執行exe文件
Process process = new Process();
process.StartInfo.FileName = exeFilePath;
//process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.Arguments = "/"" + tempFilePath + "/" /"" + resultFilePath + "/"";
process.Start();
// 如果該進程沒有執行完畢,讓下一個進程等待
while (!process.HasExited)
{
Thread.Sleep(1);
}
// 將resultFilePath 文件中的數據讀入到DataTable中
readDataFile(resultDataTable, resultFilePath);
}
catch (IOException ioEx)
{
throw ioEx;
}
catch (Exception ex)
{
throw ex;
}
}
哈!經過這樣改過之後,結果正確,就加了一小段代碼,不知道現在大家看出問題了沒有。原來process又開闢了一個進程,它跟主進程同步執行,也就是說差不多process和readDataFile()在同步執行,但是process調用exe文件花費的時間比較長,還沒等process執行完,也就是還沒有將生成的數據寫入到resultFilePath文件中就已經讀取了裏面的舊數據,所以造成顯示到界面的結果和預期不一樣。我加了一小段代碼後,也就是讓讀取文件的進程等待exe文件執行完畢後再讀取,這個時侯讀取到的數據肯定是正確的數據。
最後總結一下,用System.Diagnostics.Process類調用exe文件執行時,此Process變量會單獨開闢一個進程跟主進程同步執行,所以我們在用Process並且同時進行讀寫操作時就要注意了。