Processo de diagnóstico do sistema waitforexit exemplo
System. diagnostics. process. waitforexit exemplo
Obter através da App Store Leia esta publicação em nosso aplicativo!
WaitforExit doesn & # 39; t funcionar corretamente.
Então, estou lutando por esse problema por algum tempo agora e tentei muitas maneiras diferentes de corrigi-lo, mas não posso.
Basicamente, o meu aplicativo faz é chamar um arquivo java para carregar um aplicativo em um dispositivo. Enquanto está carregando, ele está imprimindo 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. Alguma ideia?
Eu tentei colocar a espera para sair em muitos lugares diferentes, mas isso não parece funcionar.
Dois métodos abaixo escrevem o stdout ou erro no campo richtext.
Qualquer ideia seria excelente. Basicamente eu preciso do processo para sair, então eu posso continuar a pensar que o forloop carrega o próximo arquivo.
Se você WaitForExit, seu aplicativo bloqueia (espera) até o processo sair. Isso significa que não é possível processar qualquer mensagem do Windows em seu segmento UI, portanto, não atualiza a UI.
Você precisa iniciar o processo "em segundo plano" para que sua UI continue atualizando. Isso pode ser feito com:
Inicie e monitore o processo de um segmento separado e passe as informações de progresso de volta para o segmento UI para exibição. Adicione um manipulador de eventos ao evento encerrado pelo processo ou examine periodicamente o sinalizador process. HasExited e use isso para saber quando o primeiro processo acabado. Seu manipulador de eventos iniciaria esse processo e, em seguida, sairá de volta para o loop de aplicativo principal, de modo que ele seja executado normalmente enquanto espera que o processo externo seja concluído.
Sente-se em um loop de espera ocupado até que ele seja concluído e processe os eventos do aplicativo. (Tenha cuidado com isso, pois quaisquer eventos que causem chamadas reentrantes para este código poderiam fazer coisas muito ruins. Geralmente, se você usar essa abordagem, você deve ter certeza de que o resto do seu aplicativo está "bloqueado" em um estado onde o conhece está ocupado aguardando a conclusão de um processo). Isso é efetivamente o que WaitForExit faz, mas também processa eventos de aplicativos, permitindo que a IU permaneça vagamente responsiva:
Talvez eu esteja totalmente errado aqui, mas.
Você precisa ter um espaço após o - jar.
Ou então, Java vai bombardear imediatamente.
Tentando mover a chamada WaitForExit para fora do segmento UI.
Como M. Babcock mencionou, você está mantendo as atualizações na caixa de texto rica.
Uma solução semelhante a esta pode funcionar:
Modifique btnLoad_Click para iniciar um novo tópico que processa a lista (isto vai na contagem> ramo 0)
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.
System. diagnostics. process. waitforexit exemplo
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process. WaitForExit doesn & # 39; t retornam mesmo que Process. HasExited seja verdade.
Eu uso Process. Start para iniciar um arquivo em lote. O arquivo em lote usa o comando "INICIAR" para iniciar vários programas em paralelo e depois sai.
Uma vez que o arquivo em lote é feito Process. HasExited torna-se verdadeiro e Process. ExitCode contém o código de saída correto.
Mas quando chamo Process. WaitForExit (), ele trava / nunca retorna.
O código a seguir demonstra o problema. Ele cria um arquivo em lotes, o inicia e depois imprime:
Ele deve imprimir:
. mas nunca faz (mesmo que HasExited é verdadeiro e já temos um ExitCode).
Percebi que isso só ocorre quando o arquivo em lotes contém comandos "INICIAR" e quando a saída padrão e / ou o erro padrão são redirecionados.
Por que WaitForExit () nunca retorna?
Qual é o caminho certo para esperar que esse processo saia?
É seguro apenas pesquisar Process. HasExited ou isso pode resultar em outros problemas?
PS .: Eu notei que chamar WaitForExit (100000) com um tempo limite enorme (que definitivamente não expira) retorna imediatamente quando o processo sai. Wierd. Sem tempo limite, trava.
Isso parece ser um artefato (eu diria "bug") na implementação específica do tratamento assíncrono baseado em eventos do StandardOutput e do StandardError.
Percebi que, enquanto consegui reproduzir facilmente o seu problema, simplesmente executando o código que você forneceu (excelente exemplo de código, a propósito! :)), o processo realmente não foi suspenso indefinidamente. Em vez disso, ele retornou de WaitForExit () uma vez que ambos os processos filho que tinham sido iniciados já haviam saído.
Esta parece ser uma parte intencional da implementação da classe Process. Em particular, no método Process. WaitForExit (), uma vez que acabou de aguardar o processo, ele verifica se um leitor para stdout ou stderr foi criado; se assim for, e se o valor de tempo limite para a chamada WaitForExit () for "infinito" (ou seja, -1), o código realmente espera o fim do fluxo no (s) leitor (es).
Cada leitor respectivo é criado somente quando o método BeginOutputReadLine () ou BeginErrorReadLine () é chamado. Os fluxos stdout e stderr não estão fechados até que os processos filho tenham fechado. Então, esperando no final desses fluxos irá bloquear até que isso aconteça.
Que WaitForExit () deve se comportar de forma diferente, dependendo se um tenha chamado qualquer um dos métodos que iniciam a leitura baseada em eventos dos fluxos ou não, e especialmente porque a leitura desses fluxos diretamente não faz WaitForExit () se comportar desse jeito, cria uma inconsistência na API que torna muito mais difícil de entender e usar. Enquanto eu pessoalmente chamaria isso de bug, suponho que seja possível que o (s) implementador (es) da classe Process esteja ciente dessa inconsistência e criou de propósito.
Em qualquer caso, o trabalho seria ler StandardOutput e StandardError diretamente em vez de usar a parte baseada em eventos da API. (Embora, é claro, se o código de alguém aguardasse esses fluxos, verificaria o mesmo comportamento de bloqueio até que o filho fique próximo).
Por exemplo (C #, porque eu não sei F # bem o suficiente para tapar um exemplo de código como este juntos rapidamente :)):
Felizmente, o trabalho acima ou algo semelhante abordará o problema básico que você encontrou. Meus agradecimentos ao comentarista Niels Vorgaard Christensen por dirigir-me para as linhas problemáticas no método WaitForExit (), para que eu possa melhorar essa resposta.
Calendário de forex do mercado.
Forex bank oulu aukioloajat.
System. diagnostics. process. waitforexit exemplo.
Instrui o componente Processo a aguardar o exemplo especificado de milissegundos para que o processo associado saia. A quantidade de tempo, em milissegundos, system. diagnostics. process. waitforexit aguarde o processo associado para sair. O máximo é o maior valor possível de um inteiro de bits, o que representa infinito para o sistema operacional. Nenhum Id de processo foi configurado, e um identificador do qual a propriedade Id pode ser exemplo não existe. Não existe nenhum processo associado a este objeto Processo. Você está tentando chamar WaitForExit Int32 para um processo que está sendo executado em um computador remoto. O método system. diagnostics. process. waitforexit está disponível apenas para processos que estão sendo executados no computador system. diagnostics. process. waitforexit. System. diagnostics. process. waitforexit Int32 faz o thread atual aguardar até o processo do exemplo terminar. Ele deve ser chamado após todos os outros métodos serem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exitado. Esse método instrui o componente Processo a aguardar um período finito de tempo para o processo sair. 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 Processo. WaitForExit Int32 irá comportar-se da mesma forma 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. 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. Quando um processo associado é encerrado é desligado pelo sistema operacional através de um término normal ou anormal, o sistema armazena informações administrativas sobre o processo e retorna system. diagnostics. process. waitforexit o componente que chamou o componente WaitForExit Int The Process pode acessar a informação, que inclui o ExitTimeby usando o Handle para o processo encerrado. Como o processo associado saiu, a propriedade System. diagnostics. process. waitforexit 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 é um exemplo de alças 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 ligar para o exemplo Iniciar para um processo, ligue para Fechar quando o processo associado tiver terminado e você não precisa mais de informações administrativas sobre isso. Fechar libera a memória alocada para o processo encerrado. Consulte o exemplo de código para a propriedade ExitCode. Downloads Visual Studio SDKs Software de teste Downloads gratuitos Recursos do Office System. diagnostics. process. waitforexit Recursos do servidor Recursos do SQL Server Express Recursos do Windows Server Programas Assinaturas Visão geral Administradores Estudantes Microsoft Imagine Microsoft Estudante Parceiros ISV Startups Eventos Comunidade Revista Fóruns Blogs Canal 9 Documentação APIs e referência Dev Centrais Amostras Conteúdo aposentado. O exemplo de conteúdo solicitado foi removido. Métodos de Processo de Classe de Processo Método WaitForExit. Método WaitForExit Método WaitForExit Int. Recolher a tabela de conteúdo. Esta documentação é arquivada e não está sendo mantida. Versão atual do Framework NET. Int32 A quantidade de tempo, em milissegundos, para aguardar o encerramento do processo associado. Boolean true se o processo associado for encerrado; caso contrário, falso. Condição de Exceção Win32Exception A configuração de espera não pôde ser acessada. LinkDemand para uma confiança total para o chamador imediato. Este exemplo de membro é usado por código parcialmente confiável. NET Framework Disponível desde 1. Esta página é útil? Agradecemos seus comentários. Centros de desenvolvimento Windows Office Visual Studio Microsoft Azure Mais Recursos de aprendizagem Microsoft Virtual Academy Channel 9 MSDN Magazine. Comunidade Fóruns Blogs Codeplex. Programas BizSpark para startups Microsoft Imagine para estudantes.
3 pensamentos sobre o & ldquo; System. diagnostics. process. waitforexit example & rdquo;
Se você está considerando anúncios para o seu site, eu recomendo procurar como a Mat Nastos anuncia seus próprios produtos.
Agradeço que o editor não só melhorasse meu texto, mas adicionasse recomendações e regras sobre como evitar os mesmos problemas no futuro.
Embora ela seja um pouco estranha, ela ainda é típica (a maioria da família Glass é excêntrica).
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process. WaitForExit doesn & # 39; t retornam mesmo que Process. HasExited seja verdade.
Eu uso Process. Start para iniciar um arquivo em lote. O arquivo em lote usa o comando "INICIAR" para iniciar vários programas em paralelo e depois sai.
Uma vez que o arquivo em lote é feito Process. HasExited torna-se verdadeiro e Process. ExitCode contém o código de saída correto.
Mas quando chamo Process. WaitForExit (), ele trava / nunca retorna.
O código a seguir demonstra o problema. Ele cria um arquivo em lotes, o inicia e depois imprime:
Ele deve imprimir:
. mas nunca faz (mesmo que HasExited é verdadeiro e já temos um ExitCode).
Percebi que isso só ocorre quando o arquivo em lotes contém comandos "INICIAR" e quando a saída padrão e / ou o erro padrão são redirecionados.
Por que WaitForExit () nunca retorna?
Qual é o caminho certo para esperar que esse processo saia?
É seguro apenas pesquisar Process. HasExited ou isso pode resultar em outros problemas?
PS .: Eu notei que chamar WaitForExit (100000) com um tempo limite enorme (que definitivamente não expira) retorna imediatamente quando o processo sai. Wierd. Sem tempo limite, trava.
Isso parece ser um artefato (eu diria "bug") na implementação específica do tratamento assíncrono baseado em eventos do StandardOutput e do StandardError.
Percebi que, enquanto consegui reproduzir facilmente o seu problema, simplesmente executando o código que você forneceu (excelente exemplo de código, a propósito! :)), o processo realmente não foi suspenso indefinidamente. Em vez disso, ele retornou de WaitForExit () uma vez que ambos os processos filho que tinham sido iniciados já haviam saído.
Esta parece ser uma parte intencional da implementação da classe Process. Em particular, no método Process. WaitForExit (), uma vez que acabou de aguardar o processo, ele verifica se um leitor para stdout ou stderr foi criado; se assim for, e se o valor de tempo limite para a chamada WaitForExit () for "infinito" (ou seja, -1), o código realmente espera o fim do fluxo no (s) leitor (es).
Cada leitor respectivo é criado somente quando o método BeginOutputReadLine () ou BeginErrorReadLine () é chamado. Os fluxos stdout e stderr não estão fechados até que os processos filho tenham fechado. Então, esperando no final desses fluxos irá bloquear até que isso aconteça.
Que WaitForExit () deve se comportar de forma diferente, dependendo se um tenha chamado qualquer um dos métodos que iniciam a leitura baseada em eventos dos fluxos ou não, e especialmente porque a leitura desses fluxos diretamente não faz WaitForExit () se comportar desse jeito, cria uma inconsistência na API que torna muito mais difícil de entender e usar. Enquanto eu pessoalmente chamaria isso de bug, suponho que seja possível que o (s) implementador (es) da classe Process esteja ciente dessa inconsistência e criou de propósito.
Em qualquer caso, o trabalho seria ler StandardOutput e StandardError diretamente em vez de usar a parte baseada em eventos da API. (Embora, é claro, se o código de alguém aguardasse esses fluxos, verificaria o mesmo comportamento de bloqueio até que o filho fique próximo).
Por exemplo (C #, porque eu não sei F # bem o suficiente para tapar um exemplo de código como este juntos rapidamente :)):
Felizmente, o trabalho acima ou algo semelhante abordará o problema básico que você encontrou. Meus agradecimentos ao comentarista Niels Vorgaard Christensen por dirigir-me para as linhas problemáticas no método WaitForExit (), para que eu possa melhorar essa resposta.
Calendário de forex do mercado.
Forex bank oulu aukioloajat.
System. diagnostics. process. waitforexit exemplo.
Instrui o componente Processo a aguardar o exemplo especificado de milissegundos para que o processo associado saia. A quantidade de tempo, em milissegundos, system. diagnostics. process. waitforexit aguarde o processo associado para sair. O máximo é o maior valor possível de um inteiro de bits, o que representa infinito para o sistema operacional. Nenhum Id de processo foi configurado, e um identificador do qual a propriedade Id pode ser exemplo não existe. Não existe nenhum processo associado a este objeto Processo. Você está tentando chamar WaitForExit Int32 para um processo que está sendo executado em um computador remoto. O método system. diagnostics. process. waitforexit está disponível apenas para processos que estão sendo executados no computador system. diagnostics. process. waitforexit. System. diagnostics. process. waitforexit Int32 faz o thread atual aguardar até o processo do exemplo terminar. Ele deve ser chamado após todos os outros métodos serem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exitado. Esse método instrui o componente Processo a aguardar um período finito de tempo para o processo sair. 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 Processo. WaitForExit Int32 irá comportar-se da mesma forma 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. 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. Quando um processo associado é encerrado é desligado pelo sistema operacional através de um término normal ou anormal, o sistema armazena informações administrativas sobre o processo e retorna system. diagnostics. process. waitforexit o componente que chamou o componente WaitForExit Int The Process pode acessar a informação, que inclui o ExitTimeby usando o Handle para o processo encerrado. Como o processo associado saiu, a propriedade System. diagnostics. process. waitforexit 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 é um exemplo de alças 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 ligar para o exemplo Iniciar para um processo, ligue para Fechar quando o processo associado tiver terminado e você não precisa mais de informações administrativas sobre isso. Fechar libera a memória alocada para o processo encerrado. Consulte o exemplo de código para a propriedade ExitCode. Downloads Visual Studio SDKs Software de teste Downloads gratuitos Recursos do Office System. diagnostics. process. waitforexit Recursos do servidor Recursos do SQL Server Express Recursos do Windows Server Programas Assinaturas Visão geral Administradores Estudantes Microsoft Imagine Microsoft Estudante Parceiros ISV Startups Eventos Comunidade Revista Fóruns Blogs Canal 9 Documentação APIs e referência Dev Centrais Amostras Conteúdo aposentado. O exemplo de conteúdo solicitado foi removido. Métodos de Processo de Classe de Processo Método WaitForExit. Método WaitForExit Método WaitForExit Int. Recolher a tabela de conteúdo. Esta documentação é arquivada e não está sendo mantida. Versão atual do Framework NET. Int32 A quantidade de tempo, em milissegundos, para aguardar o encerramento do processo associado. Boolean true se o processo associado for encerrado; caso contrário, falso. Condição de Exceção Win32Exception A configuração de espera não pôde ser acessada. LinkDemand para uma confiança total para o chamador imediato. Este exemplo de membro é usado por código parcialmente confiável. NET Framework Disponível desde 1. Esta página é útil? Agradecemos seus comentários. Centros de desenvolvimento Windows Office Visual Studio Microsoft Azure Mais Recursos de aprendizagem Microsoft Virtual Academy Channel 9 MSDN Magazine. Comunidade Fóruns Blogs Codeplex. Programas BizSpark para startups Microsoft Imagine para estudantes.
3 pensamentos sobre o & ldquo; System. diagnostics. process. waitforexit example & rdquo;
Se você está considerando anúncios para o seu site, eu recomendo procurar como a Mat Nastos anuncia seus próprios produtos.
Agradeço que o editor não só melhorasse meu texto, mas adicionasse recomendações e regras sobre como evitar os mesmos problemas no futuro.
Embora ela seja um pouco estranha, ela ainda é típica (a maioria da família Glass é excêntrica).
Comments
Post a Comment