C# process.StandardOutput.ReadLine () возвращает null - PullRequest
0 голосов
/ 08 мая 2020

У меня есть консольное приложение, и я пытаюсь использовать его в C# Asp. Net Core 3.1 WebApi-приложении. Я использую следующий код:

  1. Создание процесса

    Process process;
    process = new Process();
    process.StartInfo.UseShellExecute = false;
    process.StartInfo.CreateNoWindow = true;
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.RedirectStandardInput = true;
    process.StartInfo.FileName = executable;
    process.Start();
    
  2. Затем я продолжаю использовать следующий код для отправки команды в

    process.StandardInput.WriteLine(argument);
    string output = string.Empty;
    do
    {
        Thread.Sleep(50);
        output = process.StandardOutput.ReadLine();
    } while (output == null);
    

В результате для первых нескольких команд я могу правильно получить результат функции ReadLine. Однако после нескольких команд я продолжаю получать значение null, и все приложение застревает на while l oop.

Я запустил консольное приложение в консоли и отправил команды одну за другой, которые подаются на второй шаг и все они могут вернуть правильный результат и, как и ожидалось, распечатать результаты в консоли.

Может ли кто-нибудь помочь, что могло быть не так? Спасибо

1 Ответ

0 голосов
/ 08 мая 2020

Я только что создал решение с вашим подходом, и все работает правильно. Я бы посоветовал вам использовать скорее 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}' ");
        }

И все работает как задумано . Какого именно сценария вы хотите достичь? Какое приложение вы вызываете? Может в этом разница?

...