C#进程不接收输入

标签 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();

最佳答案

我的猜测是这一行在 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();

关于C#进程不接收输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9368161/

相关文章:

java - 每个 Java 应用程序是否有一个 JVM?

c# - 检测进程的两个窗口

c# - Web API 方法永远不会被路由到

c# - 根据另一个属性在 View 中显示模型属性的最佳实践

C# 并行更新字典的条目?

windows - 如何在 shell 脚本中关闭通过其参数定位的 Windows 进程?

c - 如何在 Linux 上远程控制 GDB

c# - DateTime 从 C# 到 MySQL : incomplete storage

c# - 具有可变数量参数的函数

c++ - 如何监控过程生命周期