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