我有一个调用fortran可执行文件的进程。可执行文件从用户请求文件并执行操作以查找解决方案。如果在文件上找到多个解决方案,程序将询问用户是否希望找到最佳解决方案,基本上是程序的2个输入。然后,可执行文件生成一个文本文件,提供程序的结果。
该进程可以运行,但不会生成生成的文本文件。此外,当我检查应用程序的输出时,消息提示(“输入文件”)是唯一存储在字符串中的内容,它不包括最佳解决方案的辅助提示(“是否要查找最优解决方案?“)。任何人都可以告诉我为什么会这样吗?感谢。
Process exeProcess = new Process();
exeProcess.StartInfo.FileName = "sdf45.exe";
exeProcess.StartInfo.UseShellExecute = false;
exeProcess.StartInfo.RedirectStandardError = true;
exeProcess.StartInfo.RedirectStandardInput = true;
exeProcess.StartInfo.RedirectStandardOutput = true;
exeProcess.Start();
//input file
exeProcess.StandardInput.WriteLine(Path.GetFileName(filePath));
//find optimal solution
exeProcess.StandardInput.WriteLine("Y");
string output = exeProcess.StandardOutput.ReadToEnd();
exeProcess.WaitForExit();
答案 0 :(得分:1)
我的猜测是,在FORTRAN进程甚至有机会读取输入之前,这一行正在执行(并返回):
string output = exeProcess.StandardOutput.ReadToEnd();
在这种情况下,我不能100%确定无限制流上ReadToEnd();
的结果是什么。正如Jon Skeet here所提到的,这样做的正确方法是从另一个线程中的stdout读取,或者更好地异步读取,如下所示:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspx
为了后人,一个粗略的例子:
var outputReader = new Thread(ReadOutput);
outputReader.Start(exeProcess);
其中ReadOutput的定义如下:
public void ReadOutput(Object processState) {
var process = processState as Process;
if (process == null) return;
var output = exeProcess.StandardOutput.ReadToEnd();
// Do whetever with output
}
制作初始方法:
Process exeProcess = new Process();
exeProcess.StartInfo.FileName = "sdf45.exe";
exeProcess.StartInfo.UseShellExecute = false;
exeProcess.StartInfo.RedirectStandardError = true;
exeProcess.StartInfo.RedirectStandardInput = true;
exeProcess.StartInfo.RedirectStandardOutput = true;
exeProcess.Start();
//input file
exeProcess.StandardInput.WriteLine(Path.GetFileName(filePath));
//find optimal solution
exeProcess.StandardInput.WriteLine("Y");
var outputReader = new Thread(ReadOutput);
outputReader.Start(exeProcess);
exeProcess.WaitForExit();
outputReader.Join();
答案 1 :(得分:0)
很难说,但我假设你需要将参数传递给可执行文件,就像这样
Process exeProcess = new Process();
exeProcess.StartInfo.FileName = "sdf45.exe";
exeProcess.StartInfo.UseShellExecute = false;
exeProcess.StartInfo.RedirectStandardError = true;
exeProcess.StartInfo.RedirectStandardInput = true;
exeProcess.StartInfo.RedirectStandardOutput = true;
exeProcess.StartInfo.Arguments = Path.GetFileName(filePath); //pass file path to EXE
exeProcess.Start();
希望这有帮助