C#进程未接收输入

时间:2012-02-20 20:46:16

标签: c# process

我有一个调用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();

2 个答案:

答案 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();

希望这有帮助