Beginoutputreadline waitforexit doesnt wait


Então, estou lutando por esse problema por algum tempo agora e tentei muitas maneiras diferentes de corrigi-lo, mas não posso. Basicamente, o meu aplicativo faz é chamar um arquivo java para carregar um aplicativo em um dispositivo. Enquanto está carregando sua impressão para uma caixa de richtext, então eu gostaria de passar para o próximo arquivo. O problema que estou tendo é que, enquanto o primeiro arquivo está sendo carregado, o 2º tenta carregar quais problemas de casos. Eu tentei a espera para a saída, mas se eu fizer isso, então os dados de saída não são escritos na caixa de texto rica. Qualquer ideia que tentei colocar a espera para a saída em muitos lugares diferentes, mas isso não parece funcionar. Dois métodos abaixo escrevem o stdout ou erro no campo richtext. Qualquer ideia seria excelente. Basicamente, preciso do processo para sair, então eu posso continuar a pensar que o forloop carrega o próximo arquivo. Você está recebendo algum tipo de mensagem de erro. Parece-me que seus argumentos são - Xmx512M - jar. Falta um espaço após a opção de linha de comando - jar. Isso poderia estar fazendo com que ele simplesmente saia imediatamente devido a não poder entender o comando. Além disso, como sugeriu M. Babcock, mova o método loaddPB fora do segmento UI e certifique-se de que envolve a parte de carregamento em um semáforo, dessa forma apenas um único arquivo é carregado de cada vez e a IU pode continuar a fazer o que precisa façam. Ndash SPFiredrake 9 de fevereiro às 15:29 Esteja avisado que isso é um pouco quotackishquot em que você ainda está bloqueando o segmento UI, mas você está bombeando manualmente os eventos através da fila de mensagens. Esta não é uma prática recomendada, e a maioria dos desenvolvedores recomendará contra ela. A melhor opção é lançar o código de carregamento em um segmento separado. Ndash SPFiredrake 9 de fevereiro 12 às 15: 54NET System. Diagnostics. Processo Classe 8211 Parte 1 Process. WaitForExit e. Exited evento aren8217t working Eu pensei que tinha encontrado este para ser o caso, mas foi minha culpa, provavelmente o mesmo para você também. Eu examinarei o que encontrei ao explorar e resolver esse problema. Resposta curta: se você estiver redirecionando StandardOutput e ou StandardError, use os métodos assíncronos Process. BeginErrorReadLine () e. BeginOutputReadLine () ANTES de chamar. WaitForExit () e capture a saída englobando os eventos Process. ErrorDataReceived e. OutputDataReceived. A resposta longa começa comigo usando o Visual Studio diffmerge. exe na pasta Common7IDE para comparar arquivos de texto no modo de lote. Estou apresentando um teste de regressão em um processo de lote iniciado por compilação. Eu precisava de uma ferramenta que cuspiria um arquivo de diferença de texto ao comparar dois arquivos (não um arquivo de resultado de mesclagem). WinMerge e Beyond Compare estão à minha disposição, mas eles não parecem produzir nada além de resultados mesclados (o que normalmente é o que eu quero, mas não desta vez). Minha estrutura de regressão chamará diffmerge. exe e armazenará o arquivo diff resultante para uma revisão posterior. Eu codifiquei o meu ProcessStartInfo Seguiu isso com o início do processo e aguardando o encerramento do processo. E aguarde espera. Isso me fez ler MSDN e cavando mais fundo no uso da classe Process. Descobri algumas informações interessantes, provavelmente deveria ter sido óbvio. Primeiro, descobri que algumas vezes executando meu Diferente Child Process com diferentes argumentos funcionavam, às vezes não fazia, tornando a questão misteriosa. Em segundo lugar, achei que funcionou bem quando eu não fiz uma saída de redirecionamento. Então, obviamente, estava sentindo falta de algo. Eu precisava realmente ler os Doccs da API de Processo e, assim, achei esse nugget: Artigo MSDN Depois de encontrar e ler esse artigo do MSDN, entendi. O meu exemplo de código acima funcionará se o buffer StdOut ou StdError não preencher. No entanto, o que eu estava vendo era o buffer StdOut preenchendo, o Processo Infantil foi bloqueado na próxima gravação StdOutStdError, o Processo Principal estava esperando infinitamente no Processo Criança para sair antes de ler o buffer StdOutStdError. Para mim, pareceu que o método WaitForExit e o evento Exitado estão quebrados, não apanhando o processo filho, mas foi o código que estava quebrado. Eu modifiquei o código para usar os métodos assíncronos e, de repente, meus problemas desapareceram. Não há mais bloqueio, tudo funcionou conforme o esperado. Eu usei StringBuilders como buffers para armazenar os dados recebidos nos eventos. Na parte 2, eu enfrento um problema com as implementações Process StdOutStdError ReadLine em torno de minhas necessidades específicas, entro em como resolvi esse problema.

Comments