Skip to main content

O processo waitforexit does not wait


Herança múltipla.
Derivado de muitas coisas.
Process. WaitForExit e. Exited event aren & # 8217; t working?
. NET System. Diagnostics. Process Class & # 8211; Parte 1.
Process. WaitForExit e. Exited event aren & # 8217; t working? Eu pensei que tinha achado que isso era 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 Common7 / IDE 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). O WinMerge e a 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. Codifiquei o meu ProcessStartInfo ...
Segui-se com o início do processo e aguardando o fim do processo ... e aguardando ... aguarde espera ...
Isso me fez ler o MSDN e cavar mais fundo no uso da classe Process. Descobri algumas informações interessantes, provavelmente deveria ter sido óbvio.
Primeiro, descobri que, às vezes, executando meu Diferente processo infantil com diferentes argumentos funcionavam, às vezes não o fazia, tornando a questão misteriosa.
Em segundo lugar, achei que funcionou bem quando eu não redirecionei a saída.
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 preenchido, o Processo Infantil foi bloqueado na próxima gravação StdOut / StdError, o Processo Principal estava esperando infinitamente no Processo Criança para sair antes de ler o buffer StdOut / StdError. Para mim, parecia que o método WaitForExit e / ou o evento Exited estão quebrados / não apanhando o processo filho que sai, no entanto, 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 conforme o esperado.
Eu usei StringBuilders como buffers para armazenar os dados recebidos nos eventos.
Na parte 2, eu me deparo com as implementações Process StdOut / StdError ReadLine em torno de minhas necessidades específicas, eu entro em como resolvi esse problema.

Process. waitforexit não aguarda
Obter através da App Store Leia esta publicação em nosso aplicativo!
Por que WaitForExit () doesn & # 39; t wait?
Estou adicionando ação personalizada no meu projeto de instalação VS2008 (instalador MSI).
Estou chamando um arquivo em lotes para criar banco de dados e quero excluir esses arquivos depois. Eu tenho WaitForExit (), mas não vai esperar. Por quê?
nenhuma diferença com startInfo. UseShellExecute = true; O lote foi executado sem nenhum problema porque requer entrada do usuário e eu insiro y e n para perguntas. mas essa ação de exclusão ocorreu antes da minha entrada. E eu tenho uma pausa no final do arquivo em lotes. Posso assistir o processo do arquivo em lote.
EDIT: Eu testei mais de 10 vezes, não funcionou. Após o almoço, coloquei mais um waitForExit e um loop while com o cheque HasExited. ele vai dormir dentro do loop while. Eu achei que funcionou. Então eu exclui esses códigos extras, de volta a um WaitForExit. Parece que funciona agora.

George Birbilis @zoomicon.
Engenheiro de informática, Microsoft MVP J # & # 8211; R & amp; D 2004-2018, Borland Spirit of Delphi 2001.
Gotchas at Wait para um aplicativo descascado terminar (com / sem tempo limite) com.
Encontrei um exemplo útil do suporte da Microsoft chamado "Como aguardar a conclusão de um aplicativo descascado usando Visual Basic 2005 ou Visual Basic" em support. microsoft/kb/305368.
No entanto, note que existem várias gotchas com o código fornecido lá (apenas informou a Microsoft sobre isso, espero que eles tomem nota). Também o artigo aponta para as versões C # e C ++ da amostra que, obviamente, precisam das mesmas correções.
1) existe um problema tanto na primeira amostra (espere indefinidamente) como no segundo (espera com tempo limite)
& # 8216; Aguarde a janela de processo para concluir o carregamento.
& # 8216; Aguarde até que o processo saia.
Por que esperar pela entrada ocioso em primeiro lugar? O processo pode nunca entrar no estado ocioso e sair antes disso. De acordo com msdn. microsoft/en-us/library/8d7363e2(v=VS.90).aspx, você pode obter exceção de WaitForInputIdle:
Ocorreu um erro desconhecido. O processo não conseguiu entrar no estado ocioso.
O processo já foi encerrado.
Nenhum processo está associado a este objeto Processo.
Suponho que seja melhor evitar chamar WaitForInputIdle, pois você apenas se importa com WaitForExit lá.
2) Mesmo WaitForExit pode lançar exceções que o código deve verificar de acordo com msdn. microsoft/en-us/library/fb4aw7b8.aspx.
Não existe nenhum processo associado a este objeto Processo.
Você está tentando chamar WaitForExit para um processo que está sendo executado em um computador remoto. Este método está disponível somente para processos que estão sendo executados no computador local.
3) O artigo de suporte não menciona o documento WaitForExit (timeout) (msdn. microsoft/en-us/library/fb4aw7b8.aspx) sobre o tempo limite "infinito":
No Framework versão 3.5 e versões anteriores, a sobrecarga WaitForExit aguardava milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente. Além disso, as versões anteriores não esperaram que os manipuladores de eventos saíssem se o tempo MaxValue completo fosse atingido.
Além disso, parece que a documentação para "WaitForExit (timeout)" não menciona que existe uma constante Timeout. Infinite que tem o valor -1 a usar para tais tempos limite infinitos (encontrado a partir do documento de Thread. Join): msdn. microsoft/ en-us / library / system. threading. timeout. infinite (v = VS.90).aspx.
4) A amostra não consegue chamar Close e, portanto, continua a gastar recursos para controlar o rastreamento (e "bloquear" aqueles identificadores de identificadores, obviamente, embora não seja tão fácil quanto em CPUs antigas e versões do sistema operacional ficar sem alças, espero).
Quando um processo associado sai (ou seja, quando é desligado pelo sistema de operação através de um término normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit. O componente Processo pode acessar a informação, que inclui o ExitTime, usando o Handle para o processo encerrado.
Como o processo associado saiu, a propriedade Handle do componente já não aponta para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar a informação do sistema operacional n. ° 8217 sobre o recurso do processo. O sistema está ciente de manipulações para processos que não foram lançados pelos componentes do Processo, portanto, mantém as informações ExitTime e Handle na memória até que o componente Processo liberte especificamente os recursos. Por esse motivo, sempre que você ligar para uma instância do Start for Process, chame Close quando o processo associado for encerrado e você não precisa mais de informações administrativas sobre isso. Fechar libera a memória alocada para o processo encerrado.
Observe também que poderia ter uma cláusula "Usando" ao definir o novo objeto de processo (em vez de Dim) em vez de obrigar explicitamente a "Processar fechar" no final para liberar recursos, conforme observado em msdn. microsoft/en - us / library / system. diagnostics. process. close (v = VS.90).aspx.
O método Fechar faz com que o processo pare de aguardar a saída se ele estivesse esperando, fecha o identificador do processo e limpa as propriedades específicas do processo. Fechar não fecha os leitores e escritores padrão de saída, entrada e erro caso estejam sendo referenciados externamente.
O método Dispose (Boolean) chama Close. Colocar o objeto Processo em um bloco de uso dispõe de recursos sem a necessidade de chamar Close.
5) Outro problema está na 2ª amostra (aguarde com tempo limite). Não menciona ter que chamar WaitForExit () novamente sem params após o WaitForExit (timeout) no caso em que a saída padrão foi redirecionada para manipuladores de eventos assíncronos (deve mencionar este caso para completude)
Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos, é possível que o processamento de saída não seja concluído quando esse método retornar. Para garantir que o tratamento de eventos assíncrono tenha sido concluído, chame a sobrecarga WaitForExit que não leva nenhum parâmetro depois de receber uma verdade dessa sobrecarga. Para ajudar a garantir que o evento Exited seja tratado corretamente nas aplicações Windows Forms, defina a propriedade SynchronizingObject.

Exemplo de uso.
Resolvi assim:
Eu redirecionava a entrada, a saída e o erro e administrai a leitura dos fluxos de saída e erro. Esta solução funciona para o SDK 7- 8.1, tanto para o Windows 7 como para o Windows 8.
Eu 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 erro 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 após o processo ser 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 configurá-lo como 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 conseguir uma leitura assíncrona segura de um fluxo de saída de um processo na forma real "Processo" 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.
Nenhuma das respostas acima está fazendo o trabalho.
A solução Rob trava e a solução 'Mark Byers' obtém a exceção descarta. (Eu tentei as "soluções" das outras respostas).
Então eu decidi sugerir outra solução:
Este código é depurado e funciona perfeitamente.
Eu acho que isso é uma abordagem simples e melhor (não precisamos do AutoResetEvent):
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.
Introdução.
A resposta atualmente aceita não funciona (lança exceção) e há muitas soluções alternativas, mas nenhum código completo. Isso é, obviamente, desperdiçando muito tempo das pessoas porque esta é uma questão popular.
Combinando a resposta de Mark Byers e a resposta de Karol Tyl, escrevi um código completo baseado em como eu quero usar o método Process. Start.
Eu usei-o para criar um diálogo de progresso em torno dos comandos git. É assim que eu usei isso:
Em teoria, você também pode combinar stdout e stderr, mas não testei isso.
Eu sei que isso é velho, mas, depois de ler toda essa página, nenhuma das soluções estava funcionando para mim, embora eu não tentei Muhammad Rehan porque o código era um pouco difícil de seguir, embora eu acho que ele estava no caminho certo . Quando eu digo que não funcionou, isso não é inteiramente verdade, às vezes funcionaria bem, acho que é algo a ver com a duração da saída antes de uma marca EOF.
De qualquer forma, a solução que funcionou para mim era usar diferentes threads para ler o StandardOutput e StandardError e escrever as mensagens.
Espero que isso ajude alguém, que pensou que isso poderia ser tão difícil!
As outras soluções (incluindo o EM0) ainda estão bloqueadas para o meu aplicativo, devido a tempos de espera internos e ao uso de StandardOutput e StandardError pela aplicação gerada. Aqui está o que funcionou para mim:
Editar: inicialização adicionada de StartInfo para codificar a amostra.
Este post talvez esteja desactualizado, mas descobri a principal causa por que normalmente ele trava é devido ao excesso de pilha para o redirectStandardoutput ou se você tem redirectStandarderror.
Como os dados de saída ou os dados de erro são grandes, isso causará um tempo de espera, pois ele ainda está processando por tempo indefinido.

Process. waitforexit não aguarda
Obter através da App Store Leia esta publicação em nosso aplicativo!
Por que Process. WaitForExit doesn & # 39; t wait?
Por que Process. WaitForExit não espera?
Mantém o loop e inicia o aplicativo novamente e novamente!
Trabalhou agora, não funcionava porque era assim clsProcess. WaitForExit (1000);
Este código está envolvido em um loop de tempo (verdadeiro) e não há declarações de quebra, lançamento ou retorno dentro do corpo do loop. Isso resultará em um loop infinito.
Se você quiser sair do loop uma vez que o WaitForExit tenha terminado, você precisa apresentar uma declaração de quebra para fazê-lo.
Verifique se (Process. GetProcessesByName ("ServerAPPFileManager"). Comprimento & gt; 0) não retorna falso.
Bem, é assim que você codificou. Está aguardando a saída, então na próxima declaração se inicia novamente. E, como Jared apontou, continua ficando sem nenhuma maneira de sair. então ele começa, espera que ele saia e depois comece novamente.

Comments

Popular posts from this blog

Pips toma lucro forex

Obter lucros. Definição. Uma ordem usada pelos comerciantes da moeda para fechar automaticamente a posição uma vez que determinado lucro foi feito. Embora pareça qualquer avanço adicional em lucro, ele garante um lucro específico depois que um nível foi atingido. Termos relacionados. Se você está procurando uma leitura adicional para complementar sua educação de negociação forex, você chegou ao. Uma ordem de entrada é aquela que é usada para entrar em um comércio a um nível de preço especificado. Se o par de moedas nunca. Um comerciante de posição pode ser comparado a um possegador que instala uma barraca no meio de uma compra lotada. Scalping ou negociação de curto prazo envolve fazer dúzias ou centenas de trades por dia, tentando escalar um pequeno. O índice de balanço acumulado, ou ASI, é uma ferramenta desenvolvida por J. Welles Wilder para medir a ruptura. Artigos relacionados. Observação de baleias: como detectar baleias criptas. As baleias podem causar ondas maciças no preço de ...

Notowania forex eur pln

EUR / PLN - Euro Zloty polaco. Análise. Últimos comentários EUR / PLN. Vender EURPLN. (Consulte Mais informação) 07 de setembro de 2018 07:49 AM GMT & middot; Resposta. O EURUSD tentou empurrar mais alto na semana passada na frente de 1.1415, mas adiantou-se para baixo e fechou mais baixo em 1.1252. O viés é descendente no termo mais próximo, retestrando a linha inferior do canal de alta, como você pode ver no meu gráfico diário abaixo, localizado em torno da região 1.1130, que é um bom lugar para comprar com uma parada apertada. A resistência imediata é observada em torno de 1.1285. Uma ruptura clara acima dessa área poderia levar o preço à zona neutra na área mais próxima de teste 1.1320. Receba diariamente boas inscrições por correio para mais detalhes visite meu perfil. . (Consulte Mais informação) 13 de junho de 2018 05:06 AM GMT & middot; Resposta. Venda 4.425. TP em 4.3765. (Consulte Mais informação) 11 de maio de 2018 07:26 PM GMT & middot; Resposta. Do outro lado d...

Killer binary option secret

"Como nos tropeçamos com opções binárias simples e logicas Segredo por trás dos comerciantes mais rentáveis ​​que podem dar a todos lucros inacreditáveis ​​com mais de 95% de precisão" Não há nenhum MT4, nenhum indicador, sem martingale (aumento% por perda comercial) Não "ganhe $ 20 por cada $ 2 que você perca" ou algum software BS, sem jogos de azar. Tenha em mente isso antes de continuar lendo: Em opções binárias, não há spreads, derrapagens ou Requotes e precisamos apenas um décimo de pip a nosso favor para ganhar as opções. Nós pensamos que talvez você saiba disso, mas precisamos que você tenha em mente porque o que estamos prestes a revelar está baseado nessas vantagens. Nós não vamos vender sua descoberta. NÓS PROMESEMOS É TOTALMENTE LIVRE. Bem vindo ao nosso site, Somos credores e Jorge, os criadores do sistema, e esta é a primeira vez que algo assim é revelado ao público. Uma grande bomba está prestes a explodir nas salas de estar dos corretores e você pode ...