Я только что создал решение с вашим подходом, и все работает правильно. Я бы посоветовал вам использовать скорее await Task.Delay(50)
, чем Thread.Sleep(50)
Итак, имея два таких консольных приложения. Сначала приложение, которое я хочу вызвать (я называю его «Внешним»:
static void Main(string[] args)
{
string key = String.Empty;
do
{
key = Console.ReadLine();
Console.WriteLine($"{key} was pressed in external program");
} while (key != "q");
}
, и приложение, которое вызывает этот метод:
static async Task Main(string[] args)
{
using (Process process = new Process())
{
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.FileName = @"[path_to_the_previous_console_app]\TestConsoleAppExternal.exe";
process.Start();
Console.WriteLine("Write some key");
string key = String.Empty;
do
{
key = Console.ReadLine();
await Interact(process, key);
} while (key != "q");
}
}
static async Task Interact(Process process, string argument)
{
process.StandardInput.WriteLine(argument);
string output = string.Empty;
do
{
await Task.Delay(50);
output = process.StandardOutput.ReadLine();
} while (output == null);
Console.WriteLine($"{argument} was pressed from Main process and readed output was: '{output}' ");
}
И все работает как задумано . Какого именно сценария вы хотите достичь? Какое приложение вы вызываете? Может в этом разница?