2013-10-09 5 views
1

My C# программа должна отправлять данные в стороннюю программу через стандартный вход. Тем не менее, программа ожидает, что входной поток достигнет EOF перед обработкой. Вот мой код:C# - Закрыть поток ввода дочернего процесса

// Starts the process. 
var process = new Process(); 
process.StartInfo.CreateNoWindow = true; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.RedirectStandardInput = true; 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.FileName = "foo.exe"; 
process.Start(); 

// Sends data to child process. 
var input = process.StandardInput; 
input.WriteLine("eval('2 * PI')"); 
input.Flush(); 
input.Close(); 

// Reads the result. 
var output = process.StandardOutput; 
var result = output.ReadLine(); 

Программа ребенок не будет делать ничего, и мой C# код застревает в output.ReadLine() вызова. Однако, если я убью процесс C#, тогда ребенок начнет точно работать с данными, которые я отправил. Как я могу заставить ребенка встретить EOF, пока я еще жив?

ответ

2

StreamWriter может не отправлять фактическое значение, когда оно закрывает поток. Вы можете попробовать написать свой собственный поток прямо перед тем, как закрыть его. Что-то вроде этого может работать:

input.Write((char)26); 

Возможно, вам придется выяснить, что ожидает процесс eof.

+0

Спасибо, но не сработал. Процесс ожидает фактический конец файла, а не встроенный символ EOF. – fernacolo

+0

Если закрытие потока не означает конец файла, что он ожидает? Возможно, перенаправление ввода обратно в программу даст программе необходимый ей сигнал. – tinstaafl

+1

Это сработало для меня. Я никогда не понимал, что Windows использует SUB (0x1A) для EOF, вместо того, чтобы использовать EOT (0x04), как unix. –

Смежные вопросы