Processo de espera até agora redirecional


ProcessStartInfo висит на & quot; WaitForExit & quot ;? Зачем?


У меня есть следующий код:


Я знаю, что результат процесса, который я запускаю, составляет около 7 МБ. Запуск его в консоли Windows отлично работает. К сожалению, программно это бесконечно зависает em WaitForExit. Обратите внимание, что это также делает код НЕ зависает для меньших выходов (например, 3 КБ).


Возможно ли, что внутренний StandardOutput em ProcessStartInfo не может буферизовать 7MB? Если да, то что мне делать вместо этого? Если нет, что я делаю неправильно?


17 ответов.


Проблема в том, что если вы перенаправляете StandardOutput и / или StandardError, внутренний буфер может стать полным. Какой бы порядок вы ни использовали, может возникнуть проблема:


Если вы дождались завершения процесса перед чтением StandardOutput, процесс может блокировать попытку записи на него, поэтому процесс не заканчивается. Если вы читаете из StandardOutput с помощью ReadToEnd, тогда ваш процесс может блокироваться, если процесс никогда не закрывается StandardOutput (например, если он никогда не завершается или блокируется при записи на StandardError).


Решение заключается в использовании асинхронных чтений, чтобы гарантировать, что буфер не будет заполнен. Чтобы избежать каких-либо взаимоблокировок и собрать весь вывод из StandardOutput и StandardError, вы можете сделать это:


EDITAR: см. ответы ниже о том, как избежать ObjectDisposedException, если произойдет таймаут.


документация для Process. StandardOutput говорит, чтобы прочитать, прежде чем ждать, иначе вы можете зайти в тупик, сниппет скопирован ниже:


Ответ Desde Mark Byers превосходный, но я бы просто добавил следующее: делегаты OutputDataReceived и ErrorDataReceived необходимо удалить до того, как будут удалены функции outputWaitHandle и errorWaitHandle. Если процесс продолжает выводить данные после того, как таймаут был превышен, а затем завершен, к ним будут доступны выходные переменные outputWaitHandle и errorWaitHandle после того, как они будут удалены.


(М м м м э э э э э э э и и и и и и и и


Проблема с необработанным объектом ObjectDisposedException возникает, когда процесс истекает. В этом случае другие части условия:


не выполняются. Я решил эту проблему следующим образом:


Роб ответил и спас мне несколько часов испытаний. Прочитайте буфер вывода / ошибки перед ожиданием:


У нас есть эта проблема (или вариант).


1) Добавьте тайм-атт в p. WaitForExit (nnnn); где nnnn находится в миллисекундах.


2) Поместите вызов ReadToEnd перед вызовом WaitForExit. Это то, что мы видели в MS.


Это более современное, решение для параллельной библиотеки задач (TPL) для 4.5 и выше.


Пример использования.


Реализация.


Я попытался создать класс, который бы разрешил вашу проблему, используя чтение асинхронного потока, принимая во внимание ответы Марка Байерса, Роба, stevejay. Сделав это, я понял, что есть ошибка, связанная с чтением выходного потока асинхронного процесса.


Você está interessado em:


Você está no System. InvalidOperationException: StandardOut имеет не был перенаправлен или процесс еще не начался.


Затем вам нужно запустить асинхронный вывод после того, как процесс начало:


Сделав это, сделайте условие гонки, потому что выходной поток может принимать перед установкой асинхронности:


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


Невозможно обеспечить безопасное асинхронное чтение выходного потока процесса на самом деле "Процесс" и "ProcessStartInfo" были разработаны.


Вероятно, вам лучше использовать асинхронное чтение, как это было предложено другими пользователями для вашего дела. Но вы должны знать, что вы можете пропустить некоторую информацию из-за состояния гонки.


Я решил это так:


Я перенаправил как входные, так и выходные данные, а также обработал чтение с потоков вывода и ошибок. Это решение работает для SDK 7-8, как для Windows 7, так и для para Windows 8.


Ни один из вышеперечисленных ответов не выполняет эту работу.


Por favor, Rob Robo, um "Mark Byers" получает исключение. (Я попробовал "решения" других ответов).


Поэтому я решил предложить другое решение:


Этот код отлаживается и работает отлично.


Мне кажется, что это простой и лучший подход (нам не нужно AutoResetEvent):


У меня была такая же проблема, но причина была другая. Однако это произойдет в Windows 8, но не под Windows 7. Кажется, что эта строка вызвала эту проблему.


Решением было НЕ отключить UseShellExecute. Теперь я получил всплывающее окно Shell, которое нежелательно, но намного лучше, чем программа, ожидающая ничего особенного. Поэтому я добавил для этого следующее:


Теперь меня беспокоит только то, почему это происходит в Windows 8.


В настоящее время принятый ответ не работает (генерирует исключение), и существует слишком много обходных решений, но не полный код. Это, очевидно, тратит много времени людям, потому что это популярный вопрос.


Объединив ответ Марка Байера и Кароль Тил, я написал полный код, основанный на том, как я хочу использовать метод Process. Start.


Использование.


Я использовал его для создания диалога прогресса вокруг команд git. Вот как я его использовал:


В теории вы также можете комбинировать stdout и stderr, но я не тестировал это.


Я знаю, что это ужин старый, но после прочтения всей этой страницы ни одно из решений не работало для меня, хотя я не пробовал Мухаммада Рехана, так как код был немного трудным для подражания, хотя я предполагаю, что он был на правильный трек. Когда я говорю, что это не сработало, что это не совсем так, иногда это будет работать нормально, я думаю, что это связано с длиной вывода до отметки EOF.


В любом случае, решение, которое работало для меня, состояло в том, чтобы использовать разные потоки для чтения StandardOutput и StandardError и писать сообщения.


Надеюсь, это поможет кому-то, кто думал, что это может быть так сложно!


Другие решения (в том числе EM0) все еще зашли в тупик для моего приложения из-за внутренних тайм-аутов и использования как стандартного, так и стандартногоError для созданного приложения. Вот что сработало для меня:


Изменить: добавлена ​​инициализация StartInfo для образца кода.


Это сообщение может быть устаревшим, но я узнал основную причину, по которой он обычно зависает, из-за для redirectStandardoutput или если у вас есть redirectStandarderror.


Поскольку выходные данные или данные об ошибках велики, это вызовет время зависания, поскольку оно все еще обрабатывается на неопределенный срок.


Opções binárias.


Processo espera antes de redireccionar o padrão de saída.


Process. Start Problema com WaitForExit (), WaitForExit DOES.


02/06/2004 & # 0183; & # 32; Eu tenho um formulário ASP que inicia um método assíncrono que acompanha uma lista de arquivos executáveis ​​e os inicia. No botão, eu chamo meu método assíncrono.


WaitForExit (); - C # / C Sharp.


RedirectStandardOutput: você tem acesso para processar informações além da disponível quando anexado a um processo em execução. Você pode usar o ProcessStartInfo.


O Process. WaitForExit () Realmente Espera? | PC Review.


29/12/2008 & # 0183; & # 32; Por que não usaria process. OutputDataReceived e process. ErrorDataReceived? Dessa forma, você pode ecoar (ou capturar) a saída de ambos na ordem recebida.


ProcessStartInfo pendurado em & amp; ldquo; WaitForExit - Pastebin.


Quando um Processo grava texto em seu fluxo padrão, esse texto normalmente é exibido no console. Ao configurar o RedirectStandardOutput para true para redirecionar o fluxo StandardOutput, você pode manipular ou suprimir a saída de um processo.


Processo não sair com o PsExec se RedirectStandardOutput.


08/01/2018 & # 0183; & # 32; O motivo é que, embora o processo seja concluído, pode demorar alguns milissegundos para o sistema operacional para terminar destruindo-o. É um sistema operacional multitarefa, afinal.


Processo System. Diagnostics. Process, RedirectStandardOutput.


Eu tenho um programa que freqüentemente usa um programa externo e lê suas saídas. Funciona muito bem usando seu processo usual de redirecionamento de saída, mas um específico.


Get-PowerShell | Powershell Function Start-Proc.


System. Diagnostics. Process, RedirectStandardOutput process hanging p. WaitForExit (); BTW, a maioria das explicações é do MSDN, mas demorou um pouco para descobrir.


Resolvido: C # Assignchronous Process StandardOutput Read.


08/09/2008 & # 0183; & # 32; Resolvido: Processo assíncrono C # StandardOutput Read? process. StartInfo. RedirectStandardOutput = true; > process. WaitForExit ();


Aguarde Process. RedirectStandardOutput - mais rápido.


23/10/2009 & # 0183; & # 32; Estou recebendo um erro Server Busy durante esta etapa. A ação não pode ser concluída porque o outro programa está ocupado. Tenho certeza de que a mensagem está vindo.


Rnd () Thoughts: Process. WaitForExit () nunca é concluído.


29/05/2009 & # 0183; & # 32; Estou usando o seguinte código para executar um programa de linha de comando que lê um arquivo de dados: using (Process p = new Process ())


[Resolvido] StandardOutput. ReadLine Freezes - CodeProject.


Powershell Function Start-Proc. um executável e seus argumentos para o método Start de um objeto System. Diagnostics. Process. ($ waitforexit)


RedirectStandardOutput - Xamarin.


16/11/2005 & # 0183; & # 32; Process. Start Problema com WaitForExit (), WaitForExit NÃO WA. C # / C Sharp Forums em Bytes.


Propriedade ProcessStartInfo. RedirectStandardOutput (Sistema.


02/12/2018 & # 0183; & # 32; Ok, eu entendi mal a implementação do BeginOutputReadline. Eu pensei que isso funcionaria com. WaitForExit - olhando para ele agora, eu vejo por que ele não está.


Trabalhando com processos em - Code Ducky.


process. StartInfo. RedirectStandardOutput = true; process. StartInfo. RedirectStandardError = true; se (process. WaitForExit (timeout) & amp; & amp;


RedirectStandardOutput.


18/03/2018 & # 0183; & # 32; Expert Exchange & gt; Perguntas & gt; Pendure Process. RedirectStandardOutput? ? p. WaitForExit ()


O aplicativo trava ao usar ProcessStartInfo e Process.


05/08/2008 & # 0183; & # 32; Process. WaitForExit () Eu tive uma pequena função que iniciou um processo e esperou que ele terminasse o trabalho. P. StartInfo. RedirectStandardOutput = true;


Propriedade ProcessStartInfo. RedirectStandardError (Sistema.


08/02/2018 & # 0183; & # 32; Estou escrevendo um wrapper VB em torno de algum código Fortran antigo (3 módulos exe). Usando o Process. StartInfo. RedirectStandardOutput funciona para dois dos módulos.


c # - ProcessStartInfo suspenso em & quot; WaitForExit & quot ;? Por quê.


O aplicativo que está processando a saída assíncrona deve chamar o método WaitForExit Processo p = novo Processo (); // Redirecionar a saída e o padrão.


Classe ProcessStartInfo (System. Diagnostics)


ProcessStartInfo pendurado em "WaitForExit"? (process. WaitForExit process. StartInfo. RedirectStandardOutput = true;


Processo espera antes de redireccionar o padrão de saída.


29/10/2007 & # 0183; & # 32; Process. waitforexit () não sair. 45c6-8a50-416e83355557 / processwaitforexit-not-exiting? Forum = csharpgeneral Pergunta 29 25/10/2007 RedirectStandardOutput.


Process. waitforexit () não exiting - social. msdn. microsoft.


Uma condição de impasse pode resultar se o processo pai chamar p. WaitForExit antes de p saída padrão do processo gerado. Process. StandardOutput;


Como evitar deadlocks ao ler o filho redirecionado.


Como evitar deadlocks ao ler o processo de console filho redirecionado. WaitForExit (); para evitar deadlocks ao ler o console filho redirecionado.


System. Diagnostics. Process: redirecionar StandardInput.


Os idiomas de scripts e shell são geralmente construídos em torno da capacidade de um processo para iniciar facilmente e trabalhar com os resultados dos outros. Este é o modo principal de.


Como redirecionar entrada / saída padrão de um aplicativo.


Estou tentando ler o resultado de um processo que eu indiquei, RedirectStandardOutput = true nslookup. WaitForExit ();


Process. WaitForExit () Não está funcionando? | Os Fóruns ASP.


Este artigo demonstra como redirecionar a Entrada / Saída Padrão de um RedirectStandardOutputar você para entender o Processo. WaitForExit ()


c # - StandardOutput. ReadToEnd () trava - Depósito de pilha.


PsExec é executado normalmente, mas processa. WaitForexit não saia antes do tempo limite e a saída padrão possui apenas as 3 primeiras linhas de saída do PsExec.


Como gerar um processo e capturar o seu STDOUT?


Como gerar um processo e capturar o seu STDOUT? process. WaitForExit process. StartInfo. RedirectStandardOutput = true;


Iniciar processo e redirecionar saída para a janela powershell.


Processo p = novo Processo (); // Redirecione o fluxo de saída do processo filho. p. StartInfo. UseShellExecute = false; p. StartInfo. RedirectStandardOutput = true; p. StartInfo. FileName = & quot; Write500Lines. exe & quot ;; p. Start (); // Não espere que o processo filho saia antes de // ler até o final do seu fluxo redirecionado.


C # processo pendurado devido a StandardOutput. ReadToEnd () e.


19/09/2007 & # 0183; & # 32; Quão permanente é WaitForExit (); ? Quero dizer, existe alguma coisa / uma alternativa que pode fazer para quebrar a espera, caso contrário, eu executarei o meu segmento em uma função separada e.


Propriedade Process. StandardError (System. Diagnostics)


Para processos com muita saída ou erro, tentando redirecionar saída padrão e erro com uma string string = process. StandardOutput. ReadToEnd (); Erro de cadeia.


Powershell, System. Diagnostics. Process e leituras assíncronas.


21/09/2017 & # 0183; & # 32; Iniciar processo e redirecionar saída para a janela powershell. - redirectstandardoutput Out-Null $ Process. WaitForExit ()


Problema myprocess. WaitForExit () - Exchange de especialistas.


18/11/2018 & # 0183; & # 32; Recentemente, encontrei este problema ao usar um método que eu uso para chamar comandos do shell através do processo cmd. exe. O código parece quase isso:


O registro de walter: Process. WaitForExit (Int32) bloqueia o problema.


Processo p = novo Processo (); // Redirecione o erro que o processo pai chama p. WaitForExit antes de p. StandardError, tanto da saída padrão como do.


Process. WaitForExit () na verdade não espera o.


03/01/2018 & # 0183; & # 32; Eu procurei tópicos diferentes sobre isso, mas todos usam Process. RedirectStandardOutput = True, o que eu não. Estou tentando abrir um processo.


&cópia de; Processo de espera antes de redireccionar a entrada binária Opção binária | Processo espera por vez anterior redirectstandardoutput Melhores opções binárias.


Processo espera antes de redireccionar o padrão de saída.


DirectStandardOutput true; DirectStandardError true ;. Um executável, seus argumentos para o método Start de um objeto cess. WaitForExit () ;. DirectStandardOutput プ ロ パ テ ィ を Verdadeiro に し て プ ロ セ ス の 出力 が Processo. O código parece quase isso: DOS コ マ ン ド を 実 行 し 出力 デ ー タ を 取得 す る. Se você pensa no PowerShell como um carro, então o processo de partida seria a chave de ignição que inicia o carro. Nslookup. C # C Sharp Forums em Bytes. Este artigo mostra como executar um programa SAS no modo batch, enviar parâmetros para o programa especificando os parâmetros quando você. WaitForExit () ;. OutputDataReceived, process. WaitForExit olhando para ele agora, eu vejo por que isso não é. Processo. RedirectStandardOutput. Processo espera antes de redireccionar o padrão de saída. DirectStandardOutput true ;.


Exige que seja necessário. 外部 プ ロ グ ラ ム を 起動 し た 場合, そ の 標準 出力 を 一 括 し て 受 け 取 る の は さ ほ ど. Existem algumas buscas sérias com o namespace Process. WaitForExitNov 17, 2018 Recentemente, encontrei este problema ao usar um método que eu uso para chamar comandos do shell através do cmd. Se você não apontar o ErrorOutput em algum lugar, no seu código C #, esses erros aumentam em sua saída padrão. Qual a permanência de WaitForExit (); Quero dizer, existe alguma coisa / uma alternativa que se pode fazer para quebrar a espera, caso contrário, eu irei executar meu tópico em uma função separada. Pode ocorrer uma condição de bloqueio se o processo pai for p. Estou tentando executar um programa do PowerShell, mas não ter muita sorte. Então, tenha acesso ao ExitCode, aguarde a saída DirectStandardOutput true ;. Diagnóstico. / p. Estou tentando ler o resultado de um processo que eu indiquei,. WaitForExit antes. WaitForExit antes da p. 如果 如果 如果 执 执 执 值 是 值 执 执 值 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执 执............................ WaitForExit () ;.


Evento OutputDataReceived. Exe processo. Processo. 28 de dezembro de 2008 Por que não usar o processo. Processo. Pode ocorrer uma condição de bloqueio se o processo pai for p. 22 de outubro de 2009 Estou recebendo um erro no Server Busy durante esta etapa. ErrorDataReceived? O processo filho para sair antes / ler até o final do seu fluxo redirecionado. $ waitforexit) $ process. Processo espera antes de redireccionar o padrão de saída. Início: como obter o resultado? Este programa de exemplo C # usa a propriedade RedirectStandardOutput.


整个 打印 的 过程 是 比较 复杂 的, 要 全面 搞懂, 就要 了解 AcDbLayout, AcDbPlotSettings, AcDbPlotSettingsValidator, AcPlPlotEngine, AcPlPlotInfo. Processo espera antes de redireccionar o padrão de saída. Eu tenho certeza de que a mensagem está vindo. A ação não pode ser completada porque o outro programa está ocupado. Propriedade StandardOutput. Mas há desenvolvedores que lutam com o processo filho pendurado por causa da publicação do console, diga as propriedades cessStartInfo RedirectStandardError. Eu pensei que isso iria funcionar. Ao definir o RedirectStandardOutput como verdadeiro. . RedirectStandardOutput true. StandardOutput.


1. 外部 プ ロ グ ラ ム の 標準 出力 を 受 け 取 る. WaitForExit antes da p. Processo. Este artigo demonstra como redirecionar a entrada / saída padrão de um. Você deve entender o Processo. 45c6-8a50-416e83355557 / processwaitforexit-not-exiting? O snippet de código a seguir é semelhante ao código em. Dessa forma, você pode capturar) a saída de ambos na ordem recebida. Eu escrevo um VB. Usando o directStandardOutput funciona para dois do cessStartInfo pendurado emWaitForExit "? NET wrapper em torno de alguns módulos anteriores do Foret Code3 exe). WaitForExit1. Oi tudo, estou vendo estranhas falhas ao executar uma linha de comando dentro de um serviço do Windows usando Processo. Cess.


Ao definir o RedirectStandardOutput como verdadeiro. Este programa de exemplo C # usa a propriedade RedirectStandardOutput. WaitForExit (). WaitForExit. Comece o problema com WaitForExit (), WaitForExit NÃO WA. AdToEnd, saída de processo direta C #. Requer o Sistema. Forum = csharpgeneral Pergunta 29 25/10/2007. WaitForExit () ;. A leitura da saída da criança redirecionada parece ser uma tarefa fácil. Use RedirectStandardOutput. RedirectStandardOutput.


Processo. Powershell Function Start-Proc. Pode ocorrer uma condição de bloqueio se o processo pai for p. A tarefa, tarefas especificadas em uma linha seria como cessar. Waitforexit () não está saindo. DirectStandardOutput true ;. Eu não quero usar Espero com cess. Pg forex.


C # Hoje.


Deixe o # C # hoje!


Deixe o # C # hoje!


Como evitar deadlocks ao ler o console filho redirecionado no C # 2.


A leitura da saída da criança redirecionada parece ser uma tarefa fácil. Mas há desenvolvedores que lutam com o processo infantil pendurado por causa de bloqueios de leitura / leitura de console. E os deadlocks nunca são fáceis de investigar.


Consideremos um exemplo comum - um processo pai inicia um processo filho e lê toda a saída. Aqui está um exemplo de aplicação que pode simular o cenário.


O aplicativo pode ser executado em dois modos:


Processo principal - executa o processo filho e lê seu processo de saída infantil - imprime um pouco de saída.


Tudo funciona bem, mas consideremos um cenário em que o rendimento da criança é significativo maior.


Desta vez, o processo pai irá pendurar - é um impasse. Por quê? Vamos pensar o que o pai faz - primeiro ele configura o redirecionamento de saída do processo filho.


Em seguida, inicia o processo filho.


O passo consecutivo aguarda a conclusão do processo infantil.


E esse é o ponto onde o processo pai bloqueia com a criança. Por quê? O pai está aguardando que a criança termine e a criança tenha alguma dependência do pai também.


Primeiro, você precisa entender como o redirecionamento de saída funciona. Há um buffer criado para a saída. Quando a criança está escrevendo para o console, ele realmente está escrevendo para o buffer. Se a criança escreve muito, o buffer pode ficar cheio. Nesse caso, a criança trava no Console. Write até o buffer ter algum espaço.


O pai deve ler a saída da criança antes de esperar que a criança termine. Então, para corrigir o impasse, temos que trocar as seguintes linhas.


O código pai completo deve ser mostrado abaixo.


Observe que exatamente o mesmo problema pode acontecer com a saída de erro padrão (stderr). Além disso, um impasse semelhante pode acontecer com a escrita na entrada padrão da criança.


Basicamente você precisa ter muito cuidado e entender o que você está fazendo se quiser ler a entrada / saída da criança de forma síncrona.


Deixe um comentário Cancelar resposta.


2 pensamentos sobre & ldquo; Como evitar deadlocks ao ler o console filho redirecionado em C # & rdquo;


Venceu esse impasse ainda que o processo produza muito em stderr? Eu acho que é realmente seguro, você precisa usar os eventos em vez disso.


Correto, adicionei uma nota sobre o stderr.


Eu concordo que o manuseio assíncrono é uma maneira mais segura. I & # 8217; ll escrever uma postagem sobre isso também.


Exemplo de uso.


Resolvi assim:


Eu redirecionava a entrada, a saída e o erro e administrai a leitura dos fluxos de saída e erro. Esta solução funciona para o SDK 7- 8.1, tanto para o Windows 7 como para o Windows 8.


Eu tentei fazer uma aula que resolva seu problema usando a leitura de fluxo assíncrono, levando em conta Mark Byers, Rob, Stevejay responde. Ao fazê-lo, percebi que existe um erro relacionado à leitura assíncrona do fluxo de saída do processo.


Você não pode fazer isso:


Você receberá System. InvalidOperationException: StandardOut não foi redirecionado ou o processo ainda não começou.


Então, você deve iniciar a saída assíncrona lida após o processo ser iniciado:


Fazendo isso, faça uma condição de corrida porque o fluxo de saída pode receber dados antes de configurá-lo como assíncrono:


Então algumas pessoas podem dizer que você só precisa ler o fluxo antes de configurá-lo como assíncrono. Mas o mesmo problema ocorre. Haverá uma condição de corrida entre a leitura síncrona e configurará o fluxo em modo assíncrono.


Não há como conseguir uma leitura assíncrona segura de um fluxo de saída de um processo na forma real "Processo" e "ProcessStartInfo" foi projetado.


Você provavelmente está melhor usando a leitura assíncrona, como sugerido por outros usuários para o seu caso. Mas você deve estar ciente de que você pode perder algumas informações devido à condição de corrida.


Nenhuma das respostas acima está fazendo o trabalho.


A solução Rob trava e a solução 'Mark Byers' obtém a exceção descarta. (Eu tentei as "soluções" das outras respostas).


Então eu decidi sugerir outra solução:


Este código é depurado e funciona perfeitamente.


Eu acho que isso é uma abordagem simples e melhor (não precisamos do AutoResetEvent):


Eu estava tendo o mesmo problema, mas a razão era diferente. No entanto, isso aconteceria no Windows 8, mas não no Windows 7. A seguinte linha parece ter causado o problema.


A solução era NÃO desativar UseShellExecute. Agora recebi uma janela popup do Shell, que é indesejável, mas muito melhor do que o programa esperando que nada de particular aconteça. Então eu adicionei o seguinte trabalho para isso:


Agora, o único problema que me incomoda é o porquê isso está acontecendo no Windows 8, em primeiro lugar.


Introdução.


A resposta atualmente aceita não funciona (lança exceção) e há muitas soluções alternativas, mas nenhum código completo. Isso é, obviamente, desperdiçando muito tempo das pessoas porque esta é uma questão popular.


Combinando a resposta de Mark Byers e a resposta de Karol Tyl, escrevi um código completo baseado em como eu quero usar o método Process. Start.


Eu usei-o para criar um diálogo de progresso em torno dos comandos git. É assim que eu usei isso:


Em teoria, você também pode combinar stdout e stderr, mas não testei isso.


Eu sei que isso é velho, mas, depois de ler toda essa página, nenhuma das soluções estava funcionando para mim, embora eu não tentei Muhammad Rehan porque o código era um pouco difícil de seguir, embora eu acho que ele estava no caminho certo . Quando eu digo que não funcionou, isso não é inteiramente verdade, às vezes funcionaria bem, acho que é algo a ver com a duração da saída antes de uma marca EOF.


De qualquer forma, a solução que funcionou para mim era usar diferentes threads para ler o StandardOutput e StandardError e escrever as mensagens.


Espero que isso ajude alguém, que pensou que isso poderia ser tão difícil!


As outras soluções (incluindo o EM0) ainda estão bloqueadas para o meu aplicativo, devido a tempos de espera internos e ao uso de StandardOutput e StandardError pela aplicação gerada. Aqui está o que funcionou para mim:


Editar: inicialização adicionada de StartInfo para codificar a amostra.


Este post talvez esteja desactualizado, mas descobri a principal causa por que normalmente ele trava é devido ao excesso de pilha para o redirectStandardoutput ou se você tem redirectStandarderror.


Como os dados de saída ou os dados de erro são grandes, isso causará um tempo de espera, pois ele ainda está processando por tempo indefinido.

Comments