Friday 2 March 2018

Waitforexit hasexited


Waitforexit hasexited
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process. WaitForExit (Int32)
Agora estou trabalhando em um aplicativo Console Runner que possui o seguinte código para exibir o log e esperar até que o processo seja concluído:
Eu tenho duas perguntas sobre esse pedaço de código.
Percebi que se o processo demorar mais de 30 segundos, a chamada p. ExitCode bombardeia. O que acontece se o meu processo demorar apenas 1 segundo, aguardará 30 segundos de qualquer forma ou o processo será avisado pelo CLR?
Se você tentar obter o ExitCode antes do processo ter saído, a tentativa lança uma exceção. Examine primeiro o recurso HasExited para verificar se o processo associado foi encerrado.
Não há garantia de que, quando sua chamada para WaitForExit retornar, o processo será encerrado. Da documentação de WaitForExit:
A sobrecarga WaitForExit (Int32) é usada para fazer o thread atual aguardar até o processo associado terminar. Essa sobrecarga instrui o componente Processo a aguardar uma quantidade limitada de tempo para que o processo saia. Se o processo associado não sair pelo final do intervalo porque a solicitação de término é negada, o falso é retornado ao procedimento de chamada. Você pode especificar um número negativo (Infinito) por milissegundos e Process. WaitForExit (Int32) se comportará da mesma maneira que a sobrecarga WaitForExit (). Se você passar 0 (zero) para o método, ele retorna verdadeiro somente se o processo já foi encerrado; Caso contrário, ele retorna imediatamente falso.
Observe que isso responde sua segunda pergunta. Se o processo for encerrado antes do tempo decorrido, o WaitForExit retornará.
Como você especificou um tempo limite finito, você permite a possibilidade de a função retornar antes do processo ter terminado. Então, você poderia escrever seu código como este:

Waitforexit hasexited
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process. HasExited retorna verdadeiro mesmo que o processo esteja sendo executado?
Tenho observado que Process. HasExited às vezes retorna verdadeiro mesmo que o processo ainda esteja em execução.
Meu código abaixo inicia um processo com o nome "testprogram. exe" e depois espera que ele saia. O problema é que, às vezes, eu sou jogado a exceção; Parece que mesmo que HasExited retorna verdadeiro, o processo em si ainda está vivo no sistema - como isso pode ser?
O meu programa grava um arquivo de log antes de terminar e, portanto, preciso ter certeza absoluta de que esse arquivo de log existe (aka, o processo terminou / terminou) antes de lê-lo. A verificação contínua da existência não é uma opção.
UPDATE: Eu apenas tentei aguardar com process. WaitForExit () em vez do loop de pesquisa e o resultado é exatamente o mesmo.
Adição: o código acima era apenas para demonstrar um problema "mais claro". Para deixar claro; meu problema não é que eu ainda consiga segurar o processo por Process. GetProcessesByName ("testprogram"); Depois de definir HasExited como verdadeiro.
O problema real é que o programa que estou executando externamente escreve um arquivo - apenas antes - ele termina (graciosamente). Eu uso HasExited para verificar quando o processo terminou e, portanto, eu sei que posso ler o arquivo (porque o processo foi encerrado!), Mas parece que HasExited retorna verdadeiro mesmo às vezes, quando o programa ainda não escreveu o arquivo no disco. Aqui está o código de exemplo que ilustra o problema exato:
11 Respostas.
Eu percebi que esta é uma publicação antiga, mas na minha busca para descobrir por que meu aplicativo executando o evento Exitado antes do aplicativo ter aberto mesmo descobri algo que eu poderia ser útil para as pessoas que enfrentam esse problema no futuro.
Quando um processo é iniciado, é atribuído um PID. Se o Usuário for solicitado com a caixa de diálogo Controle de Conta de Usuário e selecionar 'Sim', o processo será reiniciado e atribuído um novo PID.
Eu me sentei com isso por algumas horas, espero que isso possa salvar algum tempo.
Eu sugiro que você tente assim:
De qualquer forma. na página MSDN do HasExited Estou lendo a seguinte nota destacada:
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 essa propriedade retornar verdadeira. Para garantir que o tratamento de eventos assíncrono tenha sido concluído, chame a sobrecarga WaitForExit () que não leva nenhum parâmetro antes de verificar HasExited.
Isso pode ser de alguma forma relacionado ao seu problema, pois você está redirecionando tudo.
Primeiro, você está certo de que testprogram não gera um processo próprio e saia sem esperar que esse processo termine? Estamos lidando com algum tipo de condição de corrida aqui, e testprogram pode ser significativo.
O segundo ponto que eu gostaria de fazer é sobre isso - "Eu preciso ter certeza absoluta de que este arquivo de log existe". Bem, não existe tal coisa. Você pode fazer seu cheque, e então o arquivo desapareceu. A maneira comum de resolver isso não é verificar, mas sim fazer o que você quer fazer com o arquivo. Vá em frente, lê-lo, capture exceções, tente novamente se o assunto parece instável e você não quer mudar nada. O check-and-do funcional não funciona bem se você tiver mais de um ator (thread ou o que quer que seja) no sistema.
Um monte de idéias aleatórias segue.
Você tentou usar o FileSystemWatcher e não dependendo da conclusão do processo?
Será melhor se você tentar ler o arquivo (não verificando se ele existe, mas atuando em vez disso) no evento process. Exited? [não deve]
O sistema é saudável? Qualquer coisa suspeita no Event Log?
Alguma política de antivírus realmente agressiva pode ser envolvida?
(Não consigo contar muito sem ver todo o código e procurar no testprogram.)
Eu sei, esta é uma postagem antiga, mas posso ajudar alguém.
A classe Process ocorre por vezes! HasExited retornará verdadeiro se o processo tiver saído ou se o processo for executado com privilégios de administrador e seu programa tiver apenas privilégios de usuário.
Então, apenas para uma investigação mais aprofundada sobre a causa raiz do problema, talvez você possa verificar o que realmente está acontecendo usando o Process Monitor. Basta iniciá-lo e incluir o programa externo e sua própria ferramenta e deixá-lo registrar o que acontece.
Dentro do log você deve ver como a ferramenta externa grava no arquivo de saída e como você abre esse arquivo. Mas dentro deste log você deve ver em qual ordem todos esses acessos acontecem.
A primeira coisa que me veio à cabeça é que a classe Process não mora e o processo realmente desapareceu quando diz isso. Então, o problema é que, neste momento, parece que o arquivo ainda não está totalmente disponível. Eu acho que este é um problema do sistema operacional, porque ele mantém algumas partes do arquivo ainda dentro de um cache que não está completamente escrito no disco e a ferramenta simplesmente saiu sem limpar seus controles de arquivo.
Com isso em mente, você deve ver dentro do registro que a ferramenta externa criou o arquivo, saiu e APÓS que o arquivo será lavado / fechado (pelo sistema operacional [talvez remova todos os filtros quando você encontrou este ponto dentro do log]).
Então, se minhas suposições estiverem corretas, a causa raiz seria o mau comportamento de sua ferramenta externa, que você não pode mudar, levando a esperar um pouco depois que o processo foi encerrado e espero que o tempo limite seja longo o suficiente para obter o arquivo corado / fechado pelo sistema operacional (talvez tente abrir o arquivo em um loop com um tempo limite até que ele tenha êxito).
Para começar, existe um problema com o uso de Process. WaitForExit em vez de pesquisá-lo?
De qualquer forma, é tecnicamente possível que o processo saia de um ponto de vista utilizável, mas o processo ainda está em breve, enquanto ele faz coisas como cache de disco de descarga. O arquivo de log é especialmente grande (ou qualquer operação que está executando pesado em gravações de disco)?
Há duas possibilidades, o objeto de processo continua a manter uma referência ao processo, então ele saiu, mas ainda não foi excluído. Ou você tem uma segunda instância do processo em execução. Você também deve comparar o processo Id para se certificar. Tente isso.
Se um identificador estiver aberto ao processo, o sistema operacional liberará a memória do processo quando o processo for encerrado, mas mantém informações administrativas sobre o processo, como o identificador, o código de saída e o tempo de saída.
Provavelmente não está relacionado, mas vale a pena notar.
Se é apenas um problema 1/10 do tempo, e o processo desaparece depois de um segundo de qualquer maneira, dependendo do seu uso do HasExited, tente apenas adicionar outro atraso após a verificação HasExited, como.
e veja se o problema persiste.
Pessoalmente, sempre usei o manipulador de eventos Exitado em vez de qualquer tipo de pesquisa e um invólucro personalizado simplista em torno de System. Diagnostics. Process para lidar com coisas como segurança de thread, envolvendo uma chamada para CloseMainWindow () seguido de WaitForExit (tempo limite) e, finalmente, Kill (), logging, etc., e nunca encontrou um problema.
Talvez o problema esteja no testprogram? Este código é bastante limpo / fechado, etc.? Parece-me se testprogram escreve um arquivo no disco, o arquivo deve, pelo menos, estar disponível (vazio ou não)

o registro de walter.
. Escrevendo enquanto aprende.
Sexta-feira, 18 de novembro de 2011.
Process. WaitForExit (Int32) bloqueia o problema.
Como você pode ver, o código inicia um processo "cmd. exe" e passa para ele o comando que eu quero ser executado.
No código eu usei o comando ping - t 8.8.8.8 que, por causa da opção - t, pings o host sem parar. O que acontece? O processo "cmd. exe" juntamente com o comando ping - t nunca sai e nunca fecha o fluxo de stdout e, portanto, o nosso código trava no Output = process. StandardOutput. ReadToEnd (); linha, porque não pode ter sucesso em ler todo o fluxo.
O mesmo acontece também se um comando em um arquivo em lotes trava por qualquer motivo e, portanto, o código acima pode funcionar continuamente por anos e, em seguida, pendure de repente sem nenhum motivo aparente.
você pode enfrentar um impasse se o comando que você atribui a "cmd. exe" ou o processo que você está chamando preenche a saída padrão ou erro padrão. Isso porque nosso código não pode alcançar as linhas.
Na verdade, o processo filho (o comando ping ou um arquivo em lote ou o processo que estiver executando) não pode continuar se o nosso programa não ler os buffers preenchidos dos fluxos e isso não pode acontecer porque o código está pendurado na linha com o processo. WaitForExit () que aguardará para sempre que o projeto filho saia.
O tamanho padrão de ambos os fluxos é de 4096 bytes. Você pode testar esses dois tamanhos com esses arquivos em lote:

Xamarin.
System. Diagnostics. Process. WaitForExit Method.
Instrui o componente Processo a aguardar o número especificado de milissegundos para que o processo associado saia.
Parâmetros.
é verdade se o processo associado tenha saído; caso contrário, falso.
A sobrecarga Process. WaitForExit (Int32) é usada para fazer o thread atual aguardar até o processo associado terminar. Essa sobrecarga instrui o componente Processo a aguardar uma quantidade limitada de tempo para que o processo saia. Se o processo associado não sair pelo final do intervalo porque a solicitação de término é negada, o falso é retornado ao procedimento de chamada. Você pode especificar um número negativo (Timeout. Infinite) por milissegundos e Process. WaitForExit (Int32) se comportará da mesma forma que a sobrecarga Process. WaitForExit. Se você passar 0 (zero) para o método, ele retorna verdadeiro somente se o processo já foi encerrado; Caso contrário, ele retorna imediatamente falso.
Nas versões net_v35_long e anterior, se milissegundos fosse -1, a sobrecarga Process. WaitForExit (Int32) esperava IntO. MaxValue milissegundos (aproximadamente 24 dias), não indefinidamente.
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 assíncrono de eventos tenha sido concluído, chame a sobrecarga Process. WaitForExit que não leva nenhum parâmetro depois de receber uma verdade dessa sobrecarga. Para ajudar a garantir que o evento Process. Exited seja tratado corretamente nos aplicativos Windows Forms, defina a propriedade Process. SynchronizingObject.
Quando um processo associado é encerrado (é encerrado pelo sistema operacional através de uma terminação normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou Process. WaitForExit (Int32). O componente Processo pode, então, acessar a informação, que inclui o Process. ExitTime, usando Process. Handle para o processo encerrado.
Como o processo associado saiu, a propriedade Process. Handle do componente não mais aponta para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente das alças para os processos que não foram lançados pelos componentes do Processo, por isso mantém as informações Process. ExitTime e Process. Handle na memória até que o componente Processo liberte especificamente os recursos. Por esse motivo, sempre que você chamar Process. Start para uma instância Process, ligue Process. Fechar quando o processo associado foi encerrado e você não precisa mais de informações administrativas sobre isso. Process. Close libera a memória alocada para o processo encerrado.
Requisitos.
Assembly: System (no System. dll)
Versões de montagem: 1.0.5000.0, 2.0.0.0, 4.0.0.0.
Namespace System. Diagnostics.
Estruturas.
Interfaces.
Enumerações.
Produtos Xamarin para Visual Studio Xamarin Test Cloud Xamarin Insights Xamarin University Xamarin Studio Visual Studio Xamarin. Forms Aplicações pré-construídas Mono Licensing Company Quem somos Clientes Parceiros Blog Empregos Prêmio Pricing Centro de desenvolvedores Começar Guias Recipes Xamarin. iOS APIs Xamarin. Android APIs Xamarin. Mac APIs Fóruns Vídeos Connect Developer Support Resources Consultoria Serviços Contato Vendas Twitter GitHub Stack Overflow Facebook Google+ YouTube.
Xamarin Inc., como uma subsidiária integral da Microsoft que atua como uma entidade jurídica separada, adere à Declaração de Privacidade da Microsoft: Privacidade e biscoitos.

No comments:

Post a Comment