В C # я пытаюсь запустить программу командной строки, которая получает ввод из stdin, а затем возвращает вывод в stdout.Мне нужно сохранить cmd.exe работающим (используя / k) и в цикле for, отправить текст, а затем дождаться вывода перед отправкой следующего текста.Это работает, если я не перенаправляю стандартный вывод, но не после того, как перенаправляю его.Сначала я получил данные из stdout (хотя и намного позже), и теперь это больше не работает, кроме первоначального вызова для запуска программы.Эта ссылка говорит: «С другой стороны, вы можете избежать условия взаимоблокировки, создав два потока и считав выходные данные каждого потока в отдельном потоке».Это решило бы мою проблему, и если так, как бы я сделал это?
Код настроен следующим образом:
StringBuilde sb = new StringBuilder();
Process process = new Process();
process.StartInfo.RedirectStandardError = true;
process.StartInfo.WorkingDirectory = workingdirectory;
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = "cmd.exe";
process.StartInfo.Arguments = "/k";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardInput = true;
process.EnableRaisingEvents = true;
process.OutputDataReceived += (sender, args) => AppendData(args.Data); //this appends the output to a stringbuilder
process.ErrorDataReceived += (sender, args) => AppendError(args.Data);
process.Start();
//sw is a streamwriter
sw= process.StandardInput;
//now call the command line code
sw.WriteLine(" some.exe some.arg ");
process.BeginOutputReadLine();
foreach(DataRow row in dtMydata.Rows)
{
mytext=row["Text"].toString();
sw.WriteLine(mytext);
sw.WriteLine(Environment.NewLine); //This redirects the text to the program,
}