C # Нужно ли читать стандартный вывод в отдельном потоке? - PullRequest
2 голосов
/ 14 марта 2019

В 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,

    }
...