Wednesday 16 October 2019

O processo c # está pronto para não funcionar


Então, estou lutando por esse problema por algum tempo agora e tentei muitas maneiras diferentes de corrigi-lo, mas não posso. Basicamente, se o meu aplicativo é chamado de 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. Todas as idéias 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 idéia 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 para fora da linha 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 este é um pouco quotackishquot em que você ainda está bloqueando o thread 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. Process Classe 8211 Parte 1 Process. WaitForExit e. Exited event 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 solucionar esse problema. Resposta curta: se você estiver redirecionando o StandardOutput e o StandardError, use os métodos assíncronos Process. BeginErrorReadLine () e. BeginOutputReadLine () ANTES de chamar. WaitForExit () e capture a saída conectando 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 posterior revisão. 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, às vezes, funcionava o meu Diferente Processo Infantil com diferentes argumentos trabalhados, às vezes não fazia, tornando o assunto misterioso. Em segundo lugar, achei que funcionou bem quando não escrevi a saída de redirecionamento. Então, obviamente eu estava perdendo alguma coisa. Eu precisava realmente ler os Doccs da API de Processo e, assim, encontrei esse nugget: Artigo do 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 filho foi bloqueado na próxima gravação StdOutStdError, o processo pai estava esperando infinitamente no processo filho para sair antes de ler o buffer StdOutStdError. Para mim, pareceu que o método WaitForExit e o evento Exited estão quebrados, não apanhando o processo filho, mas era meu 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 como 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, eu entro em como resolvi esse problema.

No comments:

Post a Comment