суббота, 21 апреля 2018 г.

Começo do processo waitforexit


Waitforexit process. start
Obter através da App Store Leia esta publicação em nosso aplicativo!
Aguarde até um processo terminar.
Eu tenho um aplicativo que faz.
para iniciar outro aplicativo 'ABC'. Eu quero aguardar até que o aplicativo final (processo morre) e continuar minha execução. Como eu posso fazer isso?
Pode haver várias instâncias do aplicativo 'ABC' executando ao mesmo tempo.
Eu acho que você só quer isso:
Consulte a página MSDN para o método. Também tem uma sobrecarga onde você pode especificar o tempo limite, então você não está esperando potencialmente para sempre.
Use Process. WaitForExit? Ou assine o evento Process. Exited se você não quer bloquear? Se isso não fizer o que você quer, por favor nos dê mais informações sobre seus requisitos.
Faço o seguinte na minha aplicação:
Há alguns recursos extras lá que você pode achar úteis.
Você pode usar a espera para sair ou você pode pegar a propriedade HasExited e atualizar sua UI para manter o usuário "informado" (gerenciamento de expectativa):

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.
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.
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.
para resolver esse problema:
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.
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!
Depois de ler todos os posts aqui, resolvi a solução consolidada de Marko Avlijaš. No entanto, não resolveu todos os meus problemas.
Em nosso ambiente, temos um Serviço do Windows que está programado para executar centenas de diferentes. bat. cmd. exe. etc arquivos que se acumularam ao longo dos anos e foram escritas por muitas pessoas diferentes e em diferentes estilos. Não temos controle sobre a redação dos programas e programas; scripts, somos apenas responsáveis ​​pelo agendamento, execução e relatórios sobre o sucesso / falha.
Então eu tentei praticamente todas as sugestões aqui com diferentes níveis de sucesso. A resposta de Marko foi quase perfeita, mas quando executado como um serviço, ele nem sempre captou stdout. Nunca cheguei ao fundo do porquê não.

Como usar o Process. Start no Visual Basic.
Quando você precisa iniciar outro aplicativo usando o código VB.
O método Start do objeto Process é, possivelmente, uma das ferramentas mais subestimadas disponíveis para um programador. Como um método, o Start tem uma série de sobrecargas, que são diferentes conjuntos de parâmetros que determinam exatamente o que o método faz. As sobrecargas permitem especificar qualquer conjunto de parâmetros que você possa querer passar para outro processo quando ele for iniciado.
O que você pode fazer com o Process. Start é realmente limitado apenas pelos processos que você pode usar com ele.
Se você quiser exibir seu arquivo ReadMe baseado em texto no Bloco de notas, é tão fácil quanto:
Isso pressupõe que o arquivo LeiaMe está na mesma pasta que o programa e que o Bloco de Notas é o aplicativo padrão para os tipos de arquivo. txt e está no caminho do ambiente do sistema.
Process. Start semelhante ao Shell Command no VB6.
Para programadores familiarizados com o Visual Basic 6, Process. Start é um pouco como o comando VB 6 Shell. No VB 6, você usaria algo como:
Usando Process. Start.
Você pode usar este código para iniciar o Bloco de Notas maximizado e criar um objeto ProcessStartInfo que possa ser usado para um controle mais preciso:
Iniciando um processo oculto.
Você pode até iniciar um processo oculto.
Mas tenha cuidado. A menos que você adicione mais código para finalizar o processo, provavelmente você terá que terminá-lo no Gerenciador de Tarefas. Normalmente, os processos ocultos são usados ​​apenas com processos que não possuem nenhum tipo de interface de usuário.
Recuperando o nome de um processo.
Trabalhar com Process. Start como um objeto lhe dá muita capacidade. Por exemplo, você pode recuperar o nome do processo que foi iniciado. Este código exibirá & # 34; notepad & # 34; na janela de saída:
Isso foi algo que você não poderia fazer com o comando VB6 Shell porque lançou o novo aplicativo de forma assíncrona. Usar o WaitForExit pode causar o problema reverso porque você precisa iniciar um processo em um novo thread se precisar executá-lo de forma assíncrona. Por exemplo, se você precisa que os componentes permaneçam ativos em um formulário onde um processo foi iniciado e WaitForExit foi executado. Normalmente, esses componentes não foram ativos. Codifique-o e veja por si mesmo.
Uma maneira de forçar o processo a parar é usar o método Kill.
Este código aguarda dez segundos e depois termina o processo.
Descobri que um atraso forçado era necessário para permitir que o processo fosse concluído para evitar um erro.
Na maioria dos casos, provavelmente é uma boa ideia colocar seu processamento em um bloco Using para garantir que os recursos usados ​​pelo processo sejam liberados.
Para tornar tudo isso ainda mais fácil de se trabalhar, há até mesmo um componente Process que você pode adicionar ao seu projeto para que você possa fazer muitas das coisas mostradas acima em tempo de design, em vez de tempo de execução.
Uma das coisas que isso facilita muito é codificar eventos gerados pelo processo, como o evento quando o processo foi encerrado. Você também pode adicionar um manipulador usando um código como este:
Mas simplesmente selecionar o evento para o componente é muito mais fácil.

Processo . Método WaitForExit ()
A documentação de referência da API tem uma nova casa. Visite o navegador da API no docs. microsoft para ver a nova experiência.
Instrui o componente Processo a esperar indefinidamente para que o processo associado saia.
Assembly: System (no System. dll)
A configuração de espera não pôde ser acessada.
Nenhum Id do processo foi configurado e um identificador do qual a propriedade Id pode ser determinada não existe.
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.
WaitForExit () faz o thread atual aguardar até o processo associado 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 uma quantidade infinita de tempo para que o processo e os manipuladores de eventos saem. Isso pode fazer com que um aplicativo pare de responder. Por exemplo, se você chamar CloseMainWindow para um processo que tenha uma interface de usuário, a solicitação ao sistema operacional para encerrar o processo associado pode não ser tratada se o processo for gravado para nunca entrar no loop de mensagem.
No Quadro 3.5 e versões anteriores, a sobrecarga WaitForExit () esperava 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.
Esta sobrecarga garante que todo o processamento foi concluído, incluindo o tratamento de eventos assíncronos para saída padrão redirecionada. Você deve usar essa sobrecarga após uma chamada para a sobrecarga WaitForExit (Int32) quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos.
Quando um processo associado sai (ou seja, quando é encerrado 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 as informações do sistema operacional 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. Close libera a memória alocada para o processo finalizado.
Consulte a seção Comentários da página de referência da propriedade StandardError.
para confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

Processo . Método WaitForExit.
A documentação de referência da API tem uma nova casa. Visite o navegador da API no docs. microsoft para ver a nova experiência.
Define o período de tempo para aguardar o processo associado para sair e bloqueia o segmento de execução atual até o tempo decorrido ou o processo foi encerrado. Para evitar o bloqueio do segmento atual, use o evento Exitado.
Para exemplos de código, consulte as páginas de referência da propriedade StandardError e ExitCode.
Assembly: System (no System. dll)
Instrui o componente Processo a esperar indefinidamente para que o processo associado saia.
Instrui o componente Processo a aguardar o número especificado de milissegundos para que o processo associado saia.

Waitforexit process. start
Estou tendo um problema com isso e espero que alguns de vocês possam esclarecer isso para mim? O bloco de código:
Eu alterei o URL, obviamente, mas isso não é importante. Quando eu tento executá-lo, isso me dá uma exceção no & quot; WaitForExit & quot; linha indicando "Nenhum processo está associado a este objeto."
Qualquer ajuda aqui será muito apreciada!
O nome do arquivo de processo deve ser um arquivo executável.
SITE DO CONVERTIDOR DE CÓDIGO.
Editado por kaymaf terça-feira, 19 de outubro de 2010 18:32 Marcado como resposta por Frank L. Smith terça-feira, 19 de outubro de 2010 18:35.
Os dois métodos funcionarão.
SITE DO CONVERTIDOR DE CÓDIGO.
Marcado como resposta por Frank L. Smith terça-feira, 19 de outubro de 2010 18:44.
Todas as respostas.
O nome do arquivo de processo deve ser um arquivo executável.
SITE DO CONVERTIDOR DE CÓDIGO.
Editado por kaymaf terça-feira, 19 de outubro de 2010 18:32 Marcado como resposta por Frank L. Smith terça-feira, 19 de outubro de 2010 18:35.
O nome do arquivo de processo deve ser um arquivo executável.
SITE DO CONVERTIDOR DE CÓDIGO.
OH! Bem, isso explicaria isso, mas, no passado, usando o & quot; Process. Start ("url here & quot;") sempre funcionou.
Você tem uma idéia de como eu poderia fazer isso para que ele abra seu navegador padrão para ir ao site?
Kaymaf está certo - isso faz sentido quando eu dou um nome de arquivo ou url, ele funciona por causa do associado do arquivo. O seguinte funciona:
Eu irei com isso, mas se alguém tiver uma idéia de como eu posso conseguir usar seu navegador padrão, eu apreciaria isso.
Os dois métodos funcionarão.
SITE DO CONVERTIDOR DE CÓDIGO.
Marcado como resposta por Frank L. Smith terça-feira, 19 de outubro de 2010 18:44.
Os dois métodos funcionarão.
SITE DO CONVERTIDOR DE CÓDIGO.
Obrigado - boa informação. :)
A Microsoft está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site do Msdn.

Комментариев нет:

Отправить комментарий