Eu tenho o seguinte código: Eu sei que a saída do processo que estou começando é de cerca de 7 MB de comprimento. Executá-lo no console do Windows funciona bem. Infelizmente, programaticamente, isso trava indefinidamente no WaitForExit. Note também que este código não trava para saídas menores (como 3KB). É possível que o StandardOutput interno em ProcessStartInfo buffer de cant 7MB Em caso afirmativo, o que devo fazer em vez disso Se não, o que estou fazendo errado O problema é que se você redirecionar StandardOutput e / ou StandardError o buffer interno pode ficar cheio. Seja qual for a ordem que você usa, pode haver um problema: se você esperar que o processo saia antes de ler StandardOutput, o processo pode bloquear a tentativa de gravar nele, de modo que o processo nunca termine. Se você ler StandardOutput usando ReadToEnd, seu processo poderá ser bloqueado se o processo nunca fechar StandardOutput (por exemplo, se nunca terminar, ou se estiver bloqueado para gravar em StandardError). A solução é usar leituras assíncronas para garantir que o buffer não fique cheio. Para evitar quaisquer deadlocks e coletar todas as saídas de StandardOutput e StandardError, você pode fazer isso: EDIT: Veja as respostas abaixo para manipular o tempo limite e evitar exceções de ObjectDisposeException. A documentação para Process. StandardOutput diz para ler antes de esperar, caso contrário você pode travar, snippet copiado abaixo: A resposta de Mark Byers é excelente, mas gostaria de acrescentar o seguinte: os representantes OutputDataReceived e ErrorDataReceived precisam ser removidos antes de outputWaitHandle e errorWaitHandle descartado. Se o processo continuar a gerar dados após o tempo limite ter sido excedido e, em seguida, terminar, as variáveis outputWaitHandle e errorWaitHandle serão acessadas após serem descartadas. (FYI eu tive que adicionar esta ressalva como uma resposta, como eu não poderia comentar em seu post.) Temos esse problema também (ou uma variante). Tente o seguinte: 1) Adicione um tempo limite a p. WaitForExit (nnnn) onde nnnn está em milissegundos. 2) Coloque a chamada ReadToEnd antes da chamada WaitForExit. Isto é o que vimos MS recomendar. Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz poll em vez de usar event (quando eles estão disponíveis), então você está usando CPU sem motivo e isso indica que você é um mau programador. Sua solução é muito ruim quando comparada com a outra usando AutoResetEvent. (Mas eu não te dei -1 porque você tentou ajudar). ndash Eric Ouellet Nov 7 14 at 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 linha a seguir parece ter causado o problema. A solução foi NÃO desabilitar o UseShellExecute. Eu agora recebi uma janela popup do Shell, que é indesejada, mas muito melhor do que o programa esperando que nada de especial aconteça. Então eu adicionei a seguinte solução para isso: Agora, a única coisa que me incomoda é por que isso está acontecendo no Windows 8 em primeiro lugar. O que você está procurando? Respondendo Jan 13 15 at 10:35 Usage Example ImplementationIve olhou em diferentes tópicos sobre isso, mas todos eles usam o Process. RedirectStandardOutput True, que eu não faço. Estou tentando abrir um processo (aplicativo de console, não feito por mim) para fazê-lo compilar um arquivo. acs especial para um arquivo. o. A estrutura é simples, o único argumento é o arquivo que você deseja compilar. Mas em determinados arquivos meu aplicativo trava ao tentar abrir o processo. Heres meu código: Para iniciar o processo eu uso praticamente o mesmo código que outro cara fez em C. E seu código está funcionando perfeitamente. Espero que seu dia tenha sido melhor do que ontem, mas que seja pior do que amanhã. Por favor, marque como resposta se eu resolvi o seu problema. ) Editado por Visual Vincent sábado, 3 de janeiro de 2015 14:57 Você comparou os FileNames e Arguments dos que funcionam e os que não existem? Há alguma diferença neles, como os que trabalham não contêm espaços em branco no FileName? ou argumentos e aqueles que trabalham não contêm espaços em branco neles Se você achar que para ser o problema, então você precisa adicionar aspas para o início eo fim do FileName ou Argumentos. Meu primeiro palpite é que o Arguments precisa das Quotes assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos. ps. Arguments Chr (34) amp SavePath amp Chr (34) Se você disser que não pode ser feito, então mal tentar Editar por IronRazerz sábado, 3 de janeiro de 2015 15:51 Marcado como Resposta Visual Vincent sábado, 3 de janeiro de 2015 4:33 PM sábado, 3 de janeiro de 2015 15:41 Todas as respostas Você já comparou o FileNames e Argumentos dos que funcionam e os que não existem? Há alguma diferença neles, como os que trabalham não contêm espaços em branco no FileName ou argumentos e os que funcionam não contêm espaços em branco neles Se você achar que para ser o problema, então você precisa adicionar cotas para o início eo fim do FileName ou argumentos. Meu primeiro palpite é que o Arguments precisa das Quotes assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos. ps. Arguments Chr (34) amp SavePath amp Chr (34) Se você disser que não pode ser feito, então mal tentar Editar por IronRazerz sábado, 3 de janeiro de 2015 15:51 Marcado como Resposta Visual Vincent sábado, 3 de janeiro de 2015 4:33 PM Sábado, 3 de janeiro de 2015 15:41 Você tentou o mesmo comando manualmente em uma janela de console? Talvez ele pare e espere por algo. Ou não defina CreateNoWindow. ErrorDialog e WIndowStyle e veja o que acontece. Editado por Viorel MVP Sábado, Janeiro 03, 2015 4:27 PM sábado, 3 de janeiro, 2015 4:25 PM Você comparou os FileNames e Argumentos dos que funcionam e os que não existem? Há alguma diferença neles, como os que work não contém espaços em branco no FileName ou argumentos e aqueles que trabalham não contêm espaços em branco neles Se você achar que esse é o problema, então você precisa adicionar Quotes ao início e ao fim do FileName ou Arguments. Meu primeiro palpite é que o Arguments precisa das Quotes assim porque, eu vejo espaços em branco no seu exemplo dos Argumentos. ps. Arguments Chr (34) amp SavePath amp Chr (34) Se você disser que não pode ser feito, então mal tentar isso Isso realmente fez isso. Eu tinha esquecido que espaços em branco faz com que seja um novo argumento, bobagem comigo. Eu não uso argumentos de processo que muitas vezes. Espero que seu dia tenha sido melhor que ontem, mas que seja pior do que amanhã. Por favor, marque como resposta se eu resolvi o seu problema. ) Editado por Visual Vincent sábado, 3 de janeiro de 2015 16:33
Комментариев нет:
Отправить комментарий