process.standardoutput. ReadToEnd () всегда пустой?

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

Когда я не перенаправляю его и устанавливаю CreateNoWindow кому: false, Я вижу все правильно в консоли, но когда я перенаправляю ее, StandardOutput.ReadToEnd() всегда возвращает пустую строку.

        Process cproc = new Process();
        cproc.StartInfo.CreateNoWindow = true;
        cproc.StartInfo.FileName = Dest;
        cproc.StartInfo.RedirectStandardOutput = true;
        cproc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        cproc.StartInfo.UseShellExecute = false;
        cproc.EnableRaisingEvents = true;
        cproc.Start();
        cproc.Exited += new EventHandler(cproc_Exited);
        while(!stop)
        {
           result += cproc.StandardOutput.ReadToEnd();
        }

EventHandler cproc_exited просто наборы stop кому: true. Может кто-то объяснять почему result всегда string.Empty?

13
задан Null 13 July 2015 в 20:17
поделиться

3 ответа

[

] Почему ты петляешь? Как только он прочитан до конца, он больше не сможет читать данные, не так ли?[

] [

]Вы уверены, что текст на самом деле записывается на []StandardOutput[], а не на []StandardError[]?[

] [

](И да, очевидно, что вы хотите установить []RedirectStandardOutput[] на true, а не на false. Я предположил, что это просто случай, когда вы копируете неправильную версию своего кода.)[

] [

]EDIT: Как я уже советовал в комментариях, вы должны читать со стандартного вывода и стандартной ошибки в отдельных потоках. Делайте []а не [] ожидание выхода процесса - это может закончиться тупиком, когда вы ждете выхода процесса, но процесс блокирует попытки записи в stderr/stdout, потому что вы не читали из буфера.[

] [

]Или вы можете подписаться на события OutputDataReceived и ErrorDataReceived, чтобы не использовать лишние потоки.[

].
8
ответ дан 1 December 2019 в 20:29
поделиться
[

]У вас переадресация стандартного out отключена. Попробуйте изменить [

] [
cproc.StartInfo.RedirectStandardOutput = false;
] [

] на [

] [
cproc.StartInfo.RedirectStandardOutput = true;
] [

] Работает ли для вас следующий образец из []MSDN[]?[

] [
// Start the child process.
Process p = new Process();
// Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "Write500Lines.exe";
p.Start();
// Do not wait for the child process to exit before
// reading to the end of its redirected stream.
// p.WaitForExit();
// Read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
]
7
ответ дан 1 December 2019 в 20:29
поделиться

Избавьтесь от цикла и переведите вызов на ReadToEnd на cproc_Exited.

-1
ответ дан 1 December 2019 в 20:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: