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并且同时进行读写操作时就要注意了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值