Skip to main content

Process beginoutputreadline waitforexit


Elina: obrigado pela sua resposta. Há algumas notas na parte inferior deste MSDN doc (msdn. microsoften-uslibraryhellip) que alertam sobre potenciais bloqueios se você ler ao final de ambos os fluxos stdout e stderr redirecionados de forma síncrona. É difícil dizer se sua solução é suscetível a esse problema. Além disso, parece que você está enviando o process39 stdoutstderr output novamente na entrada. Por quê. ) Ndash Matthew Piatt 26 de setembro 16 às 4:42 Esta é uma solução mais moderna, Tarefa paralela (TPL), baseada em solução para 4.5 e acima. Exemplo de uso Implementação respondida 5 de outubro 16 às 10:54 Eu acho que isso é uma abordagem simples e melhor (não precisamos de AutoResetEvent): respondido 14 de junho 12 às 14:29 Verdadeiro, mas não deveria estar fazendo. FileName Path quotggsci. exequot quot lt Obeycommand. txtquot para simplificar o seu código também Ou talvez algo equivalente a quotggsci. exequot do quot do comando quotecho se você realmente não quiser usar um arquivo obeycommand. txt separado. Ndash Amit Naidu Jun 4 13 at 22:03 Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz uma pesquisa em vez de usar o evento (quando está disponível), você está usando a CPU sem motivo e isso indica que você é um programador ruim. Sua solução é realmente ruim quando comparada com a outra usando AutoResetEvent. (Mas não te dou -1 porque voce tentou ajudar). Ndash Eric Ouellet Nov 7 14 às 18:38 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. Respondeu 13 de janeiro 15 às 10:35 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 bug 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 depois que o processo for 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 você Configure-o para 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 obter uma leitura assíncrona segura de um fluxo de saída de um processo da maneira atual Process 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. Usando Process. BeginOutputReadLine pode levar a linhas de stdout perdidas 12219 Ao escrever o código que cria processos filho e precisa capturar o stdout, descobri que as linhas de saída faltam o Condição seguinte: muito paralelismo. ProcessStartInfo. RedirectStandardOutput true Process. OutputDataReceived CollectLines (ou seja, usando o fluxo assíncrono) Process. BeginOutputReadLine () Process. WaitForExit (int. MaxValue) Observe que passar -1 (tempo de espera infinito) para WaitForExit não faz com que as linhas faltem (com base em Meus próprios testes). Criei um pequeno aplicativo de demonstração para fazer isso. Ele representa tanto o netcoreapp1.0 quanto o net45. Processredirect. zip. Basta usar o dotnet run para experimentá-lo. Dito isto, você pode capturar stdout usando Process. StandardOutput (que é um StreamReader). No entanto, para consumir isso de forma assíncrona e segura você precisa usar threadstasks de fundo. Em outras palavras: método de captura de stdout usando tempo limite infinito, acho um problema porque é muito fácil entrar nesta armadilha. Usar os eventos para capturar a saída é muito conveniente, pois você não precisa se preocupar em fazer threads ou tarefas de fundo. Além disso, a internet recomenda este método: eu só tentei isso no Windows. NET Framework 4.5 e Core (netcoreapp1.0). Além disso, toda essa informação está relacionada ao stdout, mas imagino que o stderr tenha o mesmo problema. Minha informação de dotnet é: Ive atualizou o aplicativo de teste para suportar sistemas que não sejam do Windows (usando o eco): processredirect2.zip. Os resultados são os mesmos para Windows, Linux e Mac OS X. joelverhagen. Para melhor ou pior, o que você está vendo é um design documentado. Esta sobrecarga garante que todo o processamento foi concluído, incluindo o tratamento de eventos assíncronos para a saída padrão redirecionada. Você deve usar essa sobrecarga após uma chamada para a sobrecarga WaitForExit (Int32) quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos. Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos, é possível que o processamento de saída não seja concluído quando esse método retornar. Para garantir que o tratamento de eventos assíncrono tenha sido concluído, chame a sobrecarga WaitForExit () que não leva nenhum parâmetro depois de receber uma verdade dessa sobrecarga. Você pode ver aqui que o código explicitamente não aguarda a saída redirecionada para ser concluída se foi passado um tempo limite não-infinito: Dito isto, não sei por que foi projetado desta forma. Joelverhagen Usando WaitForExit sem tempo limite depois que a outra sobrecarga deve desbloqueá-lo, como indicado nos documentos. Ao fechar esta questão, reabra se houver mais assistência necessária.

Comments

Popular posts from this blog

Banco central de singapura vinculado à sonda forex 12

O gerente do Deutsche Bank suspendeu a indicação do forex: o Deutsche Bank, o maior credor alemão, suspendeu uma grande vendedora em uma investigação sobre a suspeita de manipulação da taxa de câmbio, informou o Wall Street Journal nesta quinta-feira. Citando uma pessoa familiarizada com o assunto, o jornal disse que o diretor de vendas do Deutsche Bank em Londres foi colocado em licença no mês passado, depois que o credor alemão descobriu o que considerava uma comunicação inadequada entre ela e o banco central de Cingapura. Respondendo ao relatório, disse uma porta-voz do Deutsche Bank, o Deutsche Bank recebeu solicitações de informações das autoridades reguladoras que estão investigando a negociação no mercado cambial. O banco está cooperando com essas investigações e tomará medidas disciplinares no que diz respeito aos indivíduos, se merecido. Por sua vez, a Autoridade Monetária de Cingapura (MAS) disse que o MAS esteve em contato com reguladores estrangeiros e está pronto para auxi...