C#執行exe文件時與主程序同步問題

 

        我們在用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並且同時進行讀寫操作時就要注意了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章