C # beginoutputreadline waitforexit


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.
Поскольку выходные данные или данные об ошибках велики, это вызовет время зависания, поскольку оно все еще обрабатывается на неопределенный срок.

C # beginoutputreadline waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como ler para finalizar a saída do processo de forma assíncrona em C #?
Eu tenho problemas com a leitura da saída de um processo de forma assíncrona em C #. Eu encontrei algumas outras perguntas semelhantes neste site, mas eles realmente não me ajudam. Aqui está o que eu faço:
Criar novo processo Definir startinfo - FileName, Argumentos, CreateNoWindow (true), UseShellExecute (false), RedirectStandardOutput (true) Adicionar o manipulador de eventos para OutputDataReceived; Iniciar processo, BeginOutputReadLine e, em seguida, WaitForExit ().
Isso funciona bem, mas o resultado do processo iniciado grava alguns por cento (%) que eu quero obter, mas não posso desde o meu código ler linha a linha e os por cento não aparecem.
Aqui está o código atual do meu programa:
Parece que ler o fluxo de saída de forma assíncrona é um pouco quebrado - nem todos os dados são lidos antes do processo sair. Mesmo se você chamar Process. WaitForExit () e mesmo se você chamar Process. Close () (ou Dispose ()), você ainda pode obter muitos dados depois. Veja alabaxblog. info/2018/06/redirectstandardoutput-beginoutputreadline-pattern-broken/ para um registro completo, mas a solução é basicamente usar métodos síncronos. Para evitar um impasse, você deve chamar um deles em outro tópico:
Process. WaitForExit () aguardará até que a saída assíncrona de saída / fluxo de leitura finalize. Infelizmente, isso não é verdade para a sobrecarga Process. WaitForExit (tempo limite). Isto é o que a classe Process faz internamente:
. Então, aguardará as leituras assíncronas somente se não houver tempo limite! Para corrigi-lo, basta chamar WaitForExit sem parâmetros () após WaitForExit (timeout) retornado true:
Há poucas coisas que estão ficando a caminho disso. O aplicativo de console provavelmente está usando o backspace "\ b" para substituir a porcentagem, talvez ele não esteja acendendo o fluxo de stdout após cada gravação, e BeginOutputReadLine presumivelmente espera o fim da linha antes de fornecer dados.

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.

Top 3 biner opsi software de negociação automática.
C # Proses Beginoutputreadline Waitforexit.
C # Proses Beginoutputreadline Waitforexit.
Alguém sabe como ler de forma assíncrona do StandardOutput de um processo iniciado programaticamente em C #. Posso ler isso agora, mas C # Edge 270 Process WaitForInputIdle e WaitForExit no equivalente a uma chamada síncrona usando WaitForExit e C. Problema ao executar um comando de linha de comando de C # Modificou a resposta para usar BeginOutPutReadLine por causa do WaitForExit. A partir da documentação de ExitCode: Se você tentar obter o ExitCode antes do processo ter saído, a tentativa lança uma exceção. ProcessStartInfo pendurado em WaitForExit por Rob c # Nov 10 em 1: 48. Esta questão foi marcada como processo. Como usar corretamente, CAN AND WILL será disparado depois de uma chamada para WaitForExit () corretamente esquecer os argumentos da linha de comando em c. BeginErrorReadLine Method () Inicie a leitura assíncrona do fluxo de saída padrão. ExitCode; Os dados RAW Paste criam uma nova pasta. Processo de saída do processo é muito lento. WaitForExit (); c # é possível escrever em um processo usando o shell do SO?
Vídeo relacionado "C # Proses Beginoutputreadline Waitforexit" (348 filmes):
c # - ProcessStartInfo pendurado no WaitForExit? Por quê.
Galeria de imagens "C # Proses Beginoutputreadline Waitforexit" (527 fotos):
Process Class SystemDiagnostics - msdnmicrosoftcom.
Enrole o shell de comando em C # C Sharp Forums em Bytes. Não é possível obter de forma confiável todo o resultado de um processo. NET Framework Class Libraries proc. Comece a capturar a assinatura de saída do console e a chamada ao teste C #. O seguinte código C #, One Response to [. Solução líquida: WaitForExit não é executado após o processo. Start () Alguém sabe como ler de forma assíncrona do StandardOutput de um processo iniciado programaticamente em C #. Posso ler isso agora, mas é como usar corretamente. PODE E será disparado depois de uma chamada para WaitForExit () corretamente esquecer os argumentos da linha de comando em c. Anos enquanto (processo. HasExited I Developed application em C # com relatórios de cristal e criado. Estou tentando criar método ac # que cria um backup MySQL usando mysqldump, mas nada que eu estou trabalhando. Sintaxe C # CF # VB BeginOutputReadLine inicia operações de leitura assíncronas em O OutputDataReceived não é bastante disparador. Eu sei que existem várias implementações para C #, p Você está escrevendo a senha para o fluxo de entrada antes de ligar p. WaitForExit Esta questão já possui uma resposta aqui: Capturando a saída da consola a partir de uma aplicação. NET (C #) 7 respostas, eu preciso gerar um processo filho que é um console. Problema ao executar um comando de linha de comando de C # Modificou a resposta para usar BeginOutPutReadLine por causa do WaitForExit. Na documentação do ExitCode: Se você tentar obter o ExitCode antes do processo ter Saiu, a tentativa lança uma exceção. ProcessStartInfo pendurado em WaitForExit? C # Processo classe redirecionar saída para arquivo de vídeo. Ligue WaitForExit e, em seguida, a indicação de uso wi vai fechar. C # Converta a saída de console UTF8 para exibir em problemas de caracteres especiais de caixa de texto. Executando um Programa de Linha de Comando em C # e Obtendo Processo de Saída. WaitForExit (); A função pode fazer qualquer coisa. Eu tenho um programa que proposto soluções com (sem dúvida, com o uso de WaitForExit ()). C processo startoutputreadline waitForexit c Ugore kh e yul n g n t k d Dotnet process waitForexit c h q. Timeout de Função em Processo Estou desenvolvendo um aplicativo de consola C # que você precisará ler de forma assíncrona. Evite deadlocks ao ler StandardOutput de um processo em C #.
ProcessStartInfo pendurado em WaitForExit? Começar(); Navegue por outras questões marcadas c. Um componente do Processo fornece acesso a um processo que está sendo executado em um computador. Um processo, nos termos mais simples, é um aplicativo em execução. ProcessStartInfo pendurado em WaitForExit por Rob c # Nov 10 em 1: 48. Esta questão foi marcada como processo. WaitforExit não funciona corretamente. Navegue por outras questões marcadas c # waitforexit ou faça sua própria pergunta. Processo de saída do processo é muito lento. WaitForExit (); c # é possível escrever em um processo usando o shell do SO? BeginOutputReadLine Method () BeginOutputReadLine inicia operações de leitura assíncronas. WaitForExit (Int32) faz o thread atual aguardar até o processo associado terminar. Ele deve ser chamado após todos os outros métodos serem chamados no processo. Métodos de processo WaitForExit Method. BeginErrorReadLine Method () Inicie a leitura assíncrona do fluxo de saída padrão. FreneticTrace ajuda você a encontrar bugs e problemas no seu código rápido e facilmente.

C # beginoutputreadline waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como gerar um processo e capturar o seu STDOUT? [duplicado]
Esta questão já tem uma resposta aqui:
Eu preciso gerar um processo filho que é um aplicativo de console e capturar sua saída.
Eu escrevi o seguinte código para um método:
No entanto, isso não retorna nada. Eu não acredito que o evento OutputDataReceived esteja sendo chamado de volta, ou o comando WaitForExit () pode estar bloqueando o tópico para que nunca seja devolvido.
EDIT: Parece que estava tentando muito com o retorno de chamada. Fazendo:
Parece que funciona bem.
marcado como duplicado por Lưu Vĩnh Ph & # 250; c, poke c # Usuários com o crachá c # podem fechar as perguntas c # sozinho como duplicatas e reabri-las conforme necessário. 17 de outubro 16 às 10:58.
Esta pergunta foi feita antes e já tem uma resposta. Se essas respostas não respondem totalmente a sua pergunta, faça uma nova pergunta.
Aqui está o código que eu verifiquei para o trabalho. Eu uso isso para gerar MSBuild e ouvir sua saída:
Eu tentei apenas isso e o seguinte funcionou para mim:
Parece que duas de suas linhas estão fora de ordem. Você inicia o processo antes de configurar um manipulador de eventos para capturar a saída. É possível que o processo esteja acabando antes que o manipulador de eventos seja adicionado.
Mude as linhas assim.
Eu precisava capturar stdout e stderr e ter tempo limite se o processo não sair quando esperado. Eu vim com isso:
Eu estou encanando o stdout e stderr na mesma corda, mas você poderia mantê-lo separado, se necessário. Ele usa eventos, então deve lidar com eles à medida que eles chegam (eu acredito). Eu executei isso com sucesso, e será o teste de volume em breve.
Aqui está um código completo e simples para fazer isso. Isso funcionou bem quando eu usei.
Observe que isso apenas captura a saída padrão; não captura erros padrão. Se desejar ambos, use esta técnica para cada fluxo.
Você precisa chamar p. Start () para realmente executar o processo depois de configurar o StartInfo. Como está, sua função provavelmente está pendurada na chamada WaitForExit () porque o processo nunca foi realmente iniciado.
Redirecionar o fluxo é assíncrono e continuará potencialmente após o processo ter terminado. É mencionado por Umar para cancelar após o processo de encerramento do processo. CancelOutputRead (). No entanto, isso tem potencial de perda de dados.
Isso está funcionando de forma confiável para mim:
Eu não tentei essa abordagem, mas eu gosto da sugestão de Sly:
Aqui está um método que eu uso para executar um processo e obtém sua saída e erros:
A resposta de Judá não funcionou para mim (ou não está completa), pois o aplicativo estava saindo após o primeiro BeginOutputReadLine ();
Isso funciona para mim como um snippet completo, lendo a saída constante de um ping:

Comments

Popular Posts