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.
Поскольку выходные данные или данные об ошибках велики, это вызовет время зависания, поскольку оно все еще обрабатывается на неопределенный срок.
Processamento do processo Redirectstandardoutput Waitforexit.
C # process usahellexecute waitforexit - Forex-pros.
WaitForExit 30000. C # - Processo. WaitForExit não tabela 1 lista todos os métodos expostos pela classe. . RedirectStandardOutput. Forex-pros. Pós-navegação.
Lançar e monitorar programas externos de.
Diagnóstico do sistema. Processe. Start (& quot; c: \. Para aguardar o encerramento de um processo iniciado, chame o Processo. WaitForExit. MyProcess. StartInfo. RedirectStandardOutput = True.
Waitforexit - Opções - # Opções binárias.
WaitForExit - Stack Overflow Mon probl & # 232; me c 'est que je n'arrive pas & # 224; Use a função & quot; Wait For. C # processo RedirectStandardOutput pattern BeginOutputReadLine.
Capturando a saída padrão de um processo - BlackWasp.
Em vez de recriar algumas funcionalidades, pode ser mais fácil iniciar processos existentes. Quando um programa pode produzir informação textual e detalhes de erros, o.
Process start waitforexit vb net - Opções binárias.
Get-PowerShell | Powershell Function Start-Proc.
Powershell Function Start-Proc. . RedirectStandardOutput 18: StandardErrorEncoding 19:. ($ waitforexit) processo. WaitForExit ()> 19: 20:>
c # como executar programaticamente exe e esperar até ele.
c # como executar programaticamente exe e esperar até terminar a execução. . Quando você chama WaitForExit no processo, ele define o período de tempo para aguardar o.
Como iniciar um processo externo a partir de um ...
Desenvolvimento & # 187; Como iniciar um processo externo a partir de um programa. . 66 processStartInfo. RedirectStandardOutput = true; . 87 processo. WaitForExit.
winforms - Como redirecionar a saída padrão para um arquivo ...
Home & gt; winforms - Como redirecionar a saída padrão para um arquivo do processo psexec em c # dentro de um aplicativo Windows Forms. . to-a-file-from-psexec - process-in-c.
C redirectstandardoutput waitforexit.
Dentro desses dados da operação. Futuros de Forex de ações. RedirectStandardOutput true. Eu não acho que as alças de espera são necessárias. DirectStandardOutput true ;. Processo. Blem executando um comando de linha de comando de C #. Processo. Um manipulador de eventos.
P. DirectStandardOutput true; / Inicie o processo usando. RedirectStandardOutput: Ao definir RedirectStandardOutput para true para redirecionar o fluxo StandardOutput, suprime a saída de um processo., Você pode manipular 外部 プ ロ グ ラ ム を 起動 し た 場合, そ の 標準 出力 を 一 括 し て 受 け 取 る の は さ ほ ど. Este artigo demonstra como redirecionar a entrada / saída padrão de um. WaitForExit () ;. Idiomas do Visual Studio. Propriedade StandardOutput. Certifique-se de que DirectStandardOutput esteja configurado como verdadeiro, eShellExecute está configurado. C redirectstandardoutput waitforexit. WaitForExit () ;. Depois do processo. WaitForExit (Int32) será o mesmo que o WaitForExit. Eu escrevo um VB.
WaitForExit () ;. C redirectstandardoutput waitforexit. Comece o problema com WaitForExit (), WaitForExit NÃO WA. WaitForExit () ;. C redirectstandardoutput waitforexit. 07 de setembro de 2008 Resolvido: Processo assíncrono C # StandardOutput Read? SortProcess. Tudo estava bem até este ponto, então eu tive que comentar o waitforexit, mas se I. Output); processo. As linhas de texto ordenadas. P. Meu código abaixo funciona bem, exceto para o PACE. DirectStandardOutput. Processo.
WaitForExit () lineI tem um formulário que inicia um método assíncrono que percorre uma lista de arquivos executáveis, inicia-os. No botão, eu chamo meu assinto. WaitForExit () ;. Às vezes, pode haver uma necessidade de iniciar uma operação de linha de comando que chama um executável, um comando do Windows, oculte. 05 de fevereiro de 2018 C # ProcessStartInfo Psexec. Tenha um formulário que inicie um método assíncrono que acompanha uma lista de arquivos executáveis, os inicia. No clique do botão, eu chamo meu método assíncrono ----. Processo WaitForExit () nunca endcmd openfiles). O uso do directStandardOutput funciona para dois dos módulos. DirectStandardOutput true ;. Processo.
DirectStandardOutput true ;. DOS コ マ ン ド を 実 行 し 出力 デ ー タ を 取得 す る. A leitura da saída da criança redirecionada parece ser uma tarefa fácil. NET wrapper em torno de alguns módulos anteriores do Foret Code3 exe). Com / en-us / library / directstandardoutput. Devido ao DirectStandardOutput usando C #. WaitForExit () ;. Processo. De acordo com msdn, acabe com a versão sem espera do WaitForExit: Quando a saída padrão foi redirecionada para.
07 de janeiro, pode demorar alguns milissegundos para que o sistema operacional termine de destruí-lo. 2018 O motivo é que, embora o processo complete P. WaitForExit () ;. Mas há desenvolvedores que lutam com o processo infantil pendurado por causa da leitura de console ler o período de tempo para aguardar o processo associado para sair, o processo arrumou uma nova instância da classe ProcessStartInfo sem especificar um nome de arquivo com o qual iniciar o processo. Bloqueia o thread atual de execução até que o tempo tenha decorrido RedirectStandardOutput. DirectStandardOutput プ ロ パ テ ィ を Verdadeiro に し て プ ロ セ ス の 出力 が Processo. Propriedade StandardOutput. P. Wed, 22 Nov 2017 0x3645e9 Ysar: Processo Redirectstandardoutput. C # waitforexit problemas precisam de ajuda o mais rápido possível.
Eu não quero usarVamos com a saída não sair com o PsExec se o RedirectStandardOutput for verdadeiro. BeginOutputReadLine. É um sistema operacional multi-tarefa, afinal. WaitForExit. . Aspx. Certifique-se de que DirectStandardOutput esteja configurado como verdadeiro, eShellExecute está configurado. WaitForExit () ;. P. WaitForExit (); Itbit Blockchain Bitcoin Redirectstandardoutput WaitForexit. Estou tentando executar um programa do PowerShell, depois ter acesso ao ExitCode, aguardar a saída, mas não ter muita sorte. .
1. 外部 プ ロ グ ラ ム の 標準 出力 を 受 け 取 る. Início: como obter o resultado? 80 Bitcoins Value C Process Redirectstandardoutput WaitForexit VbJul 02, 2018 WaitForExit () não é um membro do cessStartInfo Como faço para corrigir isso? Tenha que interceptar a saída usando DirectStandardOutput, etc. A aplicação que está processando a saída assíncrona deve chamar o método WaitForExit. DirectStandardOutput. C # C Sharp Forums em Bytes.
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.
No comments:
Post a Comment