Eu tenho um executável, que corre muito bem quando eu executá-lo manualmente, e ele existe como deveria com a saída esperada. Mas quando eu executá-lo com o método abaixo, o evento Process. Exited nunca é acionado. Observe que eu me lembrei do Process. EnableRaisingEvents O problema é o mesmo, se eu usar Process. WaitForExit () em vez de extensões reativas, para aguardar o evento de saída. Além disso, se eu executar o processo com outro argumento, que produz uma outra saída, ele existe muito bem. Parece ter algo a ver com o processo. StartInfo. RedirectStandardOutput verdadeiro desde quando eu desativar isso, ele funciona. Mas isso poderia ser apenas um sintoma de outro problema. Qualquer ajuda é apreciada :-) Theres um impasse em seu código. Saída padrão é apenas um tipo de pipe nomeado, que tem um buffer pequeno para transferir dados de um processo para o outro. Se o buffer está cheio, o processo de gravação tem de aguardar o processo de leitura para recuperar alguns dados do buffer. Assim, o processo que você iniciou pode esperar para você ler a saída padrão, mas você está esperando para o processo de terminar antes de começar a ler - deadlock. A solução é para ler continuamente enquanto o processo está em execução - basta chamar StandardOutput. ReadToEnd () antes de chamar WaitForExit (). Se você quiser ler sem bloquear o thread atual, você pode usar BeginOutputReadLine () e os eventos OutputDataReceived. Respondido Feb 28 12 at 15: 19I8217ve visto muitas perguntas sobre stackoverflow e outros lugares sobre a execução de um processo e captura de saída it8217s. Usar o System. Diagnostics. Process corretamente não é fácil e na maioria das vezes it8217s feito errado. Alguns erros comuns com System. Diagnostics. Process: Não capturar ambos os fluxos de saída (saída de saída de erro) Não redirecionar entrada pode causar aplicativos para travar Não fechar entrada redirecionada pode causar aplicativos para travar Não chamando BeginOutputReadLine / BeginErrorReadLine quando usando eventos Usando OutputDataReceived / ErrorDataReceived without Esperando por null Não verificando para null em manipuladores OutputDataReceived / ErrorDataReceived Esquecendo para definir EnableRaisingEvents true ao usar o evento Exited Forgetting ErrorDialog, CreateNoWindow ou UseShellExecute configurações Manipulação incorreta de StandardOutput ou StandardError fluxo leitores Então, com isto dito, aqui estão algumas diretrizes básicas: Use Os eventos OutputDataReceived / ErrorDataRecieved NÃO o StandardOutput ou StandardError. Isto irá poupar-lhe um monte de dor de cabeça e gerenciamento de linha desnecessária. Sempre capturar toda a entrada E saída, se você don8217t plano para fornecer entrada, fechar o fluxo imediatamente. Seu processo não foi feito até que ele saiu E você leu todos os dados. OutputDataReceived CAN AND WILL ser disparado após uma chamada para WaitForExit () retorna. Você precisará de identificadores de espera para cada fluxo de saída e definirá o identificador de espera depois de receber os dados (nulos). Trackbacks Comentários Pesquisar Projetos Related Posts Copyright 2008-2017 por Roger Knapp, Todos os direitos reservados. Eu sou workign em um programa que atua como um instalador para vários programas. Meu programa simples executa outros programas de instalação como processos de C. Eu estava tentando usar o evento process. Exited para desencadear o próximo passo da instalação, mas esse evento nunca parece ser disparado mesmo quando os processos está terminado e termina-se Alguém sabe por que isso é e uma solução para ele. Eu preciso de uma maneira de controlar as diferentes etapas de forma linear e evitar que vários processos sejam executados simultaneamente. Gostaria de usar o método. WaitForExit (), mas isso impede que o meu formulário do Windows de atualizar e colocar um objeto diferente em cima dele faz parecer que o formulário não está respondendo. Obrigado pela ajuda Segunda-feira, 20 de março de 2006 22:04 Respostas Tente definir a propriedade Process. EnableRaisingEvents como true. Tuesday, March 21, 2006 4:40 AM É porque os eventos estão sendo executados em outro segmento que você tem para empurrar as chamadas de volta para o thread principal usando control. invoke () weblogs. asp. net/justinrogers/articles/126345. Aspx inclui uma explicação detalhada. Terça-feira, 21 de março de 2006 19:27 Todas as respostas Tente definir a propriedade Process. EnableRaisingEvents como true. Terça-feira, 21 de março de 2006 4:40 AM Obrigado pela ponta Terça-feira, 21 de março de 2006 15:18 Essa linha de código que você me deu permite que os eventos sejam acionados, mas também causou alguns outros problemas Depois que o evento foi Eu não consigo alterar nenhuma das propriedades dos objetos do formulário. Ele diz que eles foram criados em outro segmento. Eu estou usando um P4 com hyperthreadign, mas eu não tenho sido doin programação thread. Eu tentei executar o programa com CheckForIllegalCrossThreadCalls falso o programa poderia executar, mas quando eu tentei abrir um novo formulário do evento funtion (ou de uma função chamada pela função de evento) o formulário não iria carregar corretamente e iria parar de responder Alguém tem uma idéias O que está causando isso e o que os processos têm a ver com ele. Terça-feira, 21 de março de 2006 4:09 PM Estou tendo o mesmo tipo de problema. Eu tenho um formulário com um botão e uma barra de progresso. Estou usando Process. Start () para dois (2) processos sob o evento buttonClick (). O que eu quero fazer é mostrar o status através de progrssbar após cada processo é concluído. Estou usando WaitForExit () para o processo para sair. Mas a barra prgress não é atualizada após cada chamada para Process. Start (). Parece que o formulário principal perde o foco quando um processo é iniciado e nunca recebe de volta até que todos os processos sejam concluídos. Eu tentei this. Active () no formulário após WaitForExit (), não funcionou. PrCA1.Exited novo EventHandler (ProcessExitedEvent), mas ele não trabalho. Qualquer pista sobre como atualizar a barra de progresso no formulário após cada chamada Processs. Start (). Aqui está o código de exemplo: com Progressbar1.Step 25 private void InstallClick (remetente do objeto, System. EventArgs e) // FPM Processo de Instalação prcA1 Process. Start (quotA1.exequot) //prcA1.Exited novo EventHandler (ProcessExitedEvent) // prcA1.EnableRaisingEvents true prcA1.WaitForExit () this. Activate () progressBar1.PerformStep () // Processo de Instalação do Driver prcB1 Process. Start (quotB1.exequot) // prcB1.Exited novo EventHandler (ProcessExitedEvent) // prcB1.EnableRaisingEvents true prcDriverB1. WaitForExit () progressBar1.PerformStep () // Processo de instalação do driver prcC1 Process. Start (quotC1.exequot) // prcC1.Exited novo EventHandler (ProcessExitedEvent) // prcC1.EnableRaisingEvents true prcC1.WaitForExit () progressBar1.PerformStep () // Processo de Instalação do Driver prcD1 Process. Start (quotD1.exequot) // prcD1.Exited novo EventHandler (ProcessExitedEvent) // prcD1.EnableRaisingEvents true prcD1.WaitForExit () progressBar1.PerformStep () // private void ProcessExitedEvent (object sender, System. EventArgs E) // // this. Activate () //progressBar1.PerformStep () // terça-feira, 21 de março de 2006 16:45
No comments:
Post a Comment