Tuesday 20 March 2018

Processo beginoutputreadline waitforexit


Opções binárias.
C # processo beginoutputreadline waitforexit.
Como ler para finalizar a saída do processo de forma assíncrona em C #?
Esta questão já tem uma resposta aqui: Capturando a saída do console de um aplicativo (C #) 7 respostas; Eu preciso gerar um processo filho que é um console.
O evento Process. WaitForExit e. Exited não está funcionando.
C # Processo de redirecionamento de saída para arquivo de vídeo - Pastebin.
Rnd () Thoughts: Process. WaitForExit () nunca é concluído.
StandardOutput. ReadLine congela. Estou tentando ler o resultado de um processo que eu indiquei, nslookup. WaitForExit ();
Process. WaitForExit () - Expert Exchange.
Para aguardar o encerramento de um processo iniciado, chame o método Process. WaitForExit. O aplicativo deixará de executar até o processo iniciado sair.
Lançar e monitorar programas externos de.
Proporção de argumento de informações de início de processo. 0. // processo de confirmação saiu p. WaitForExit (); Método MSDN Process. BeginOutputReadLine. c #.
Iniciando um processo e capturando sua saída (C #) & # 183; GitHub.
2018-08-21 & # 0183; & # 32; Antecedentes: recebo um monte de tráfego procurando detalhes sobre como executar um processo e coletar o resultado do processo. Se você ainda não o fez, você deveria.
gdal - Como chamo ogr2ogr de uma aplicação C #.
2017-11-21 & # 0183; & # 32; WaitForExit Method. Processo. BeginOutputReadLine Method () Inicie o processo. Ligue BeginOutputReadLine para o Processo.
Como iniciar um processo externo a partir de um programa.
解决 c # - Tendo problemas com a classe Processar ao redirecionar process. WaitForExit (); processo entre a chamada para processar.
Não é possível obter de forma confiável todo o resultado de um processo.
解决 c # - Process. WaitForExit p. BeginOutputReadLine (); Não há garantia de que, quando sua chamada para WaitForExit retornar, o processo será encerrado.
Propriedade System. Diagnostics. Process. StandardOutput - Xamarin.
2018-12-07 & # 0183; & # 32; Como aguardar um processo de linha de comando e capturar sua saída O processo possui um método p. WaitForExit () que bloqueia um segmento até o processo ter terminado.
P = NP: executando um programa de linha de comando em C # e.
2018-09-30 & # 0183; & # 32; cyborgmaguscsharpedge / tem todos os meus tutoriais em vídeo geralmente com o código-fonte em uma ciber-biblioteca organizada. Neste vídeo, aprendemos a transformar um.
Inicie Proccess, mostre a saída em tempo real do processo. : csharp.
Tweet TweetHi Guys, Então, no meu processo de desenvolvimento de um util que utiliza "Um conhecido compressor de javascript" para compactar arquivos de javascript. Eu encontrei onde eu.
c # - ProcessStartInfo suspenso em & quot; WaitForExit & quot ;? Por quê.
Iniciando um processo e capturando sua saída (C #) Raw. process. BeginOutputReadLine (); process. WaitForExit ();
Método Process. WaitForExit (Int32) (System. Diagnostics)
Eu tenho um processo que C # começa. Eu preciso da saída para mostrar em tempo real, já que o processo é executado por 2 horas. Este código a seguir mostra apenas o.
C # Process wrapper & # 183; GitHub.
2018-05-04 & # 0183; & # 32; A saída da consola pode ser facilmente escrita pela classe System. Console, então, deixe Out-Null $ process. WaitForExit () Out-Null $ process. BeginOutputReadLine.
Process. BeginErrorReadLine Method (System. Diagnostics)
2004-06-02 & # 0183; & # 32; Home / ASP Forums / Languages ​​/ C # / Process. WaitForExit () Não está funcionando? Process. WaitForExit () Não está funcionando? RSS. 1 resposta Última postagem 02 de junho de 2004.
Processo compreensivo em C #
2008-08-11 & # 0183; & # 32; Tempo limite de Função em Processo Estou desenvolvendo um aplicativo de console C # que você precisará ler de forma assíncrona com BeginOutputReadLine ().
C # Edge 270 Process WaitForInputIdle e WaitForExit - YouTube.
Neste artigo, vou explicar você sobre o Diagnóstico e Processo em C #. Processo compreensivo em C #. Puran Mehra; 04 de fevereiro de 2018; // process. WaitForExit ();
Resolvido: C # Assignchronous Process StandardOutput Read.
Diagnóstico do sistema; Processo; StandardOutput; Process. BeginOutputReadLine inicia a leitura assíncrona entre o chamador eo processo filho. O seguinte C #
Powershell, System. Diagnostics. Process e leituras assíncronas.
2008-12-29 & # 0183; & # 32; System. Diagnostics. Process: redirecione StandardInput, 'NOT WaitForExit ainda, uma vez que isso iria introduzir deadlocks. p. InputAndOutputToEnd.
Teste C # »Usando Process. Start para capturar a saída do console.
Observações. WaitForExit é usado para fazer o thread atual aguardar até o processo associado terminar. Essa sobrecarga do WaitForExit instrui o componente Processo.
p = Process. Start (); p. BeginOutputReadLine (); p.
Usando Process. BeginOutputReadLine pode levar a linhas de stdout perdidas # 12219. Process. BeginOutputReadLine () Process. WaitForExit (int. MaxValue) Observe que passar -1.
Process. WaitForExit () Não está funcionando? | Os Fóruns ASP.
2018-08-04 & # 0183; & # 32; Processo. BeginErrorReadLine Uma vez que o fluxo redirecionado de um Processo é aberto em qualquer fluxo de saída padrão. netProcess. BeginOutputReadLine ();
WaitForExit (); - C # / C Sharp.
private static void OutputHandler (objeto theProcess, DataReceivedEventArgs evtdata) //evtdata. Data tem os dados de saída. // usá-lo, exibi-lo ou descartá-lo>
Jan David Narkiewicz (Desenvolvedor): Chamando Python de / C #
Desenvolvimento »Como iniciar um processo externo a partir de um programa. 87 process. WaitForExit process. BeginOutputReadLine ();
Process. BeginOutputReadLine Method (System. Diagnostics)
C # Processo classe redirecionar saída para arquivo de vídeo. // Inicie o processo com a informação que especificamos. // Ligue para WaitForExit e depois a declaração de uso será fechada.
ProcessStartInfo pendurado em "WaitForExit"? Por quê? | pawanagrawal.
2018-12-18 & # 0183; & # 32; stackoverflow / questions / 139593 / processstartinfo-hanging-on-waitforexit-why O problema é que se você o processo pode.
[] Solução: WaitForExit NÃO é executado após Processo.
2008-04-05 & # 0183; & # 32; Olá, estou tendo problemas com Process. WaitForExit () congelando meu código por um tempo. Aqui está o meu código: pStart. Start () Conceitos-chave do Delegado usando C #.
&cópia de; C # processo beginoutputreadline waitforexit Opção binária | C # processo beginoutputreadline waitforexit Melhores opções binárias.

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

Processo beginoutputreadline waitforexit
Obter através da App Store Leia esta publicação em nosso aplicativo!
Obtenha saída ao vivo do Processo.
Tenho um problema no meu projeto. Gostaria de iniciar um processo, 7z. exe (versão do console). Eu tentei três coisas diferentes:
Process. StandardOutput. ReadToEnd (); OutputDataReceived & amp; BeginOutputReadLine StreamWriter.
Nada funciona. Ele sempre "espera" no final do processo para mostrar o que eu quero. Eu não tenho nenhum código para colocar, apenas se você quiser meu código com uma das coisas listadas até lá. Obrigado.
Onde "processo" é o meu processo pré-fabricado.
Ok, eu sei por que isso não funciona corretamente: 7z. exe é o bug: exibe uma porcentagem de carga no console, e ele envia informações somente quando o arquivo atual está finalizado. Na extração, por exemplo, funciona bem :). Vou procurar outra maneira de usar as funções 7z sem 7z. exe (talvez com 7za. exe ou com alguma DLL). Obrigado a todos. Para responder à pergunta, o evento OuputDataRecieved funciona bem!
[Editar] Este é um exemplo de trabalho:
Btw, ls - R C: \ lista todos os arquivos da raiz de C: recursivamente. Estes são muitos arquivos, e tenho certeza que não é feito quando os primeiros resultados aparecem na tela. Existe a possibilidade de que 7zip mantenha a saída antes de mostrá-la. Eu não tenho certeza do que você me dá para o processo.
Eu não sei se alguém ainda está procurando por uma solução para isso, mas surgiu várias vezes para mim, porque estou escrevendo uma ferramenta na Unity em apoio de alguns jogos e devido à interoperabilidade limitada de certos sistemas com mono (como PIA para ler texto do Word, por exemplo), muitas vezes tenho que escrever executáveis ​​específicos do sistema operacional (às vezes Windows, às vezes MacOS) e iniciá-los no Process. Start ().
O problema é que, quando você inicia um executável como este, ele será ativado em outro segmento que bloqueia seu aplicativo principal, causando um atraso. Se você quiser fornecer feedback útil aos seus usuários durante este período, além dos ícones de rotação evocados pelo seu sistema operacional, então você está meio ferrado. Usar um fluxo não funcionará porque o segmento ainda está bloqueado até a conclusão da execução.
A solução que eu acertei, o que pode parecer extremo para algumas pessoas, mas acho que funciona muito bem para mim, é usar sockets e multithreading para configurar comecções síncronas confiáveis ​​entre os dois aplicativos. Claro, isso só funciona se você estiver criando ambas as aplicações. Caso contrário, acho que você não tem sorte. . Gostaria de ver se ele funciona com apenas multithreading usando uma abordagem de fluxo tradicional, então se alguém gostaria de tentar isso e publicar os resultados aqui que seria ótimo.
De qualquer forma, aqui está a solução que está funcionando para mim:
No principal, ou aplicativo de chamada, faço algo como isto:
Aqui eu estabeleço o servidor de soquete:
Aqui está o meu manipulador de soquete para o segmento. note que você terá que criar vários tópicos em alguns casos; é por isso que eu tenho essa lista _builderCommThreads lá (eu usei isso do código em outro lugar onde eu estava fazendo algo parecido, mas chamando várias instâncias em uma linha):
Claro, você precisará declarar algumas coisas no topo:
. então, no executável invocado, configure o outro lado (eu usei estabilidade neste caso, você pode usar o que quiser):
. Estou usando isso para iniciar uma ferramenta de linha de comando no Windows que usa o material do PIA para extrair o texto de um documento do Word. Eu tentei PIA o. dlls em Unity, mas encontrei problemas de interoperabilidade com mono. Também estou usando o MacOS para invocar scripts de shell que lançam instâncias Unity adicionais em batchmode e executem scripts de editor nas instâncias que conversam com a ferramenta em relação a essa conexão de soquete. É ótimo, porque agora posso enviar comentários ao usuário, depurar, monitorar e responder a etapas específicas do processo, etc., e assim por diante.
Para lidar corretamente com o redirecionamento de saída e / ou erro, você também deve redirecionar a entrada. Parece ser característica / erro no tempo de execução do aplicativo externo que você está iniciando e do que eu vi até agora, não é mencionado em nenhum outro lugar.
Utilizei a classe CmdProcessor descrita aqui em vários projetos com muito sucesso. Parece um pouco assustador no início, mas é muito fácil de usar.
Deixe o acima estar em um segmento.
Agora, para atualizar a saída para UI, você pode usar um temporizador com duas linhas.

Processo 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.

No comments:

Post a Comment