Saturday 12 August 2017

C # Process Beginoutputreadline Waitforexit


Eu tenho problemas com a leitura do resultado 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: Faça novo processo Defina startinfo - FileName, Argumentos, CreateNoWindow (true), UseShellExecute (false), RedirectStandardOutput (true) Adicione o manipulador de eventos ao processo de saída OutputDataReceived, BeginOutputReadLine e WaitForExit (). Isso funciona bem, mas o resultado do processo iniciado grava alguns por cento () que eu quero obter, mas eu não posso, pois meu código lê linha a linha e os por cento não aparecem. Aqui está o código atual do meu programa: há poucas coisas que estão ficando a caminho disso. O aplicativo de console provavelmente está usando b backspace para substituir a porcentagem, talvez ele não esteja acendendo o fluxo de stdout após cada gravação, e BeginOutputReadLine provavelmente espera o fim da linha antes de fornecer dados. Veja como você continua com o processo de leitura. StandardOutput. BaseStream via BeginRead (este código não é assíncrono adequado e o bs precisará processado de forma diferente se o seu progresso em um formulário): Process. WaitForExit () aguardará até a leitura do fluxo de erro assíncrona de fluxo acabado. Infelizmente, isso não é verdade para a sobrecarga Process. WaitForExit (tempo limite). Isso é 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 verdadeiro: 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 baseada em TPL (Task Parallel Library) mais moderna e esperada para. NET 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.

No comments:

Post a Comment