Friday, 30 March 2018

Vb net process waitforexit timeout


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.

Vb net process waitforexit timeout
Obter através da App Store Leia esta publicação em nosso aplicativo!
Como usar Process. WaitForExit.
Estou chamando um aplicativo da 3ª parte que "às vezes" funciona no VB (é um WCF autônomo). Mas às vezes o aplicativo de terceiros pendura para sempre, então adicionei um temporizador de 90 segundos. O problema é, como eu sei se o tempo expirou?
O código parece assim:
O que eu gostaria de fazer é algo assim.
Verifique o valor de retorno do método - msdn. microsoft/en-us/library/ty0d8k56.aspx - se a chamada expirar, ele retornará False.
Houve problemas conhecidos no passado em que os aplicativos congelariam ao usar WaitForExit.

Processo . Método WaitForExit (Int32)
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 aguardar o número especificado de milissegundos para que o processo associado saia.
Assembly: System (no System. dll)
Parâmetros.
A quantidade de tempo, em milissegundos, para aguardar o encerramento do processo associado. O máximo é o maior valor possível de um inteiro de 32 bits, que representa infinito para o sistema operacional.
Valor de retorno.
é verdade se o processo associado tenha saído; caso contrário, falso.
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 (Int32) 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 (Int32) 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 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 Processar. 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.
No Quadro 3.5 e versões anteriores, se o milissegundo fosse -1, a sobrecarga WaitForExit (Int32) esperava milissegundos MaxValue (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 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 (é 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 WaitForExit (Int32). 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. Fechar libera a memória alocada para o processo encerrado.
Consulte o exemplo de código para a propriedade ExitCode.
para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

Como usar 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 subapreciadas 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 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 ReadMe está na mesma pasta que o programa e que o Notepad é o aplicativo padrão para tipos de arquivos. txt e ele 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. Na VB 6, você usaria algo como:
Usando Process. Start.
Você pode usar esse código para iniciar o Bloco de notas maximizado e criar um objeto ProcessStartInfo que você pode usar para um controle mais preciso:
Iniciando um processo oculto.
Você pode até começar 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. Os processos ocultos normalmente são usados ​​apenas com processos que não possuem qualquer tipo de interface de usuário.
Recuperando o Nome de um Processo.
Trabalhando com Process. Start como um objeto oferece 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. O uso de WaitForExit pode causar o problema inverso porque você deve iniciar um processo em um novo tópico se precisar dele para executar 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 terminasse de sair para evitar um erro.
Na maioria dos casos, provavelmente é uma boa idéia colocar seu processamento em um bloco Usando para garantir que os recursos usados ​​pelo processo sejam lançados.
Para tornar tudo isso ainda mais fácil de trabalhar, há mesmo um componente do Processo 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 torna muito mais fácil é codificar os eventos criados 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.

Horror de codificação.
programação e fatores humanos.
Process. Start e representação.
Você sabia que Process. Start sempre usa o contexto de segurança do processo ASP principal? Acabei de descobrir isso da maneira mais difícil; Usando Process. Start on & quot; whoami. exe & quot; sempre retorna o processo de trabalho do ASPNET, não importa o que eu faça. Algumas pesquisas apareceram nesta entrada no blog de Scott:
Eu queria executar esses processos com a identidade do cliente, mas isso representa um problema. A classe Process no System. Diagnostics pode criar um novo processo, mas o processo sempre herda o contexto de segurança do processo pai. Mesmo que o ASPthread que invoca o método Start é representando um cliente, o processo ainda começa com as credenciais do processo de trabalho do ASP.
Digite 2.0, que inclui as propriedades Usuário, Domínio e Senha no tipo ProcessStartInfo. Em 2.0 você pode iniciar um processo sob um conjunto diferente de credenciais.
Maneira de esfregar sal nas minhas feridas, Whidbey. Esta é uma limitação muito infeliz de 1.1, pois limita severamente o que posso fazer com Process. Start em um aplicativo da web. Scott oferece uma amostra do código C # de exemplo que chama as APIs do Win32 para simular uma versão simplificada do comportamento da Whidbey hoje.
Se você não está chamando Process. Start, você pode se tornar personificado para obter o comportamento que deseja. O artigo MSKB Como implementar a representação em um aplicativo ASP oferece algumas soluções alternativas agradáveis ​​e relativamente indoloras:
O último método é o mais interessante para mim - ele permite que você personifique um usuário arbitrário sobre a marcha, execute um conjunto específico de código como esse usuário e volte ao credencial ASP. Tenha em mente que a representação é uma operação muito cara; Não é algo que você quer fazer com freqüência.
O código de Scott assume que queremos representar o usuário atual e que não temos a senha. Eu quero processar. Inicie como uma conta de função arbitrária usando informações de conta e senha de texto sem formatação. Isso requer uma solução mais masoquística - chamando o método Win32 API novo CreateProcessWithLogonW () diretamente. O único código de exemplo bom que eu poderia encontrar foi para VB6: como iniciar um processo como outro usuário do Visual Basic. No entanto, não consegui que isso funcionasse na VB.
Mesmo que eu pudesse obter esse chamado de API para trabalhar, eu ainda não teria as comodidades da classe de Processo que eu preciso. Quero redirecionar a saída padrão e a saída de erro padrão, depois as capture em strings, para que eu possa ecoar o resultado da minha operação de linha de comando na página da Web. Existe um bom exemplo de comportamento de captura de linha de comando no CodeProject. Isso é para WinForms, mas o processo é semelhante para o ASP. Bem, exceto por esse péssimo problema de credenciais Process. Start ... outro motivo para esperar 2.0, eu acho.
Shellicious.
Web Farms e ASP ViewState.
Escrito por Jeff Atwood.
Entusiastas do interior. Co-fundador de Stack Overflow e Discourse. Disclaimer: Eu não tenho idéia do que eu estou falando. Encontre-me aqui: twitter / codinghorror.
O Codage Horror tem sido continuamente publicado desde 2004.

No comments:

Post a Comment