Friday, 21 July 2017

Vb Waitforexit


Elina: obrigado pela sua resposta. Há algumas notas na parte inferior deste MSDN doc (msdn. microsoften-uslibraryhellip) que alertam sobre potenciais bloqueios se você ler ao final de ambos os fluxos stdout e stderr redirecionados de forma síncrona. É difícil dizer se sua solução é suscetível a esse problema. Além disso, parece que você está enviando o process39 stdoutstderr output novamente na entrada. Por quê. ) Ndash Matthew Piatt 26 de setembro 16 às 4:42 Esta é uma solução baseada em Biblioteca de Tarefas Paralelas (TPL), mais moderna, para. NET 4.5 e acima. Exemplo de uso Implementação respondida 5 de outubro 16 às 10:54 Eu acho que isso é uma abordagem simples e melhor (não precisamos de AutoResetEvent): respondido 14 de junho 12 às 14:29 Verdadeiro, mas não deveria estar fazendo. FileName Path quotggsci. exequot quot lt Obeycommand. txtquot para simplificar o seu código também Ou talvez algo equivalente a quotggsci. exequot do quot do comando quotecho se você realmente não quiser usar um arquivo obeycommand. txt separado. Ndash Amit Naidu Jun 4 13 at 22:03 Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz uma pesquisa em vez de usar o evento (quando está disponível), você está usando a CPU sem motivo e isso indica que você é um programador ruim. Sua solução é realmente ruim quando comparada com a outra usando AutoResetEvent. (Mas não te dou -1 porque voce tentou ajudar). Ndash Eric Ouellet Nov 7 14 às 18:38 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. Respondeu 13 de janeiro 15 às 10:35 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 bug 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 depois que o processo for 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 você Configure-o para 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 obter uma leitura assíncrona segura de um fluxo de saída de um processo da maneira atual Process 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. Como usar Process. Start no Visual Basic. NET By Dan Mabbutt. Visual Basic Expert O método Start do objeto Process é possivelmente uma das ferramentas mais subapreciadas disponíveis para você como programador. Como um método. NET, o Start tem uma série de sobrecargas (diferentes conjuntos de parâmetros que determinam exatamente o que o método faz). Nesse caso, as sobrecargas permitem especificar exatamente 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. Continue a ler abaixo. O que é dizer, não há nenhum limite, pois mais continuam a chegar o tempo todo. Se você quiser exibir seu arquivo 34ReadMe34 baseado em texto no Bloco de Notas, ele é tão fácil quanto: Isso pressupõe que o arquivo ReadMe está na mesma pasta que o programa e que o Bloco de Notas é o aplicativo padrão para tipos de arquivo. txt e it39s no ambiente do sistema caminho. Para os VB639ers na audiência, Process. Start é um pouco como o comando VB6 Shell. No VB6, você pode usar algo como: lngPID 61 Shell (34MyTextFile. txt34, vbNormalFocus) Você ainda pode ligar para o comando Shell no VB. NET, mas eu não o recomendaria. Use Process. Start em vez disso. Você pode usar esse código em vez disso para iniciar o Bloco de Notas maximizado e criar um objeto ProcessStartInfo que você pode usar para um controle mais preciso: Dim ProcessProperties As New ProcessStartInfo ProcessProperties. FileName 61 34notepad34 ProcessProperties. Arguments 61 34myTextFile. txt34 ProcessProperties. WindowStyle 61 ProcessWindowStyle. Maximized Dim myProcess Como processar 61 Process. Start (ProcessProperties) Continue lendo abaixo Você pode até começar um processo oculto. ProcessProperties. WindowStyle 61 ProcessWindowStyle. Hidden 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. Trabalhar com Process. Start como um objeto. NET oferece muita capacidade. Por exemplo, você pode recuperar o nome do processo que foi iniciado. Este código exibirá 34notepad34 na janela de saída: Dim myProcess As Process 61 Process. Start (34MyTextFile. txt34) Console. WriteLine (myProcess. ProcessName) Se você precisa suspender a execução do seu programa até o processo ter terminado (algo que você poderia fazer Com código API na VB6), aqui você vai. Console. WriteLine (34Notepad terminou: 34 amp. MyProcess. ExitTime amp Environment. NewLine amp 34Exit Code: 34 amp myProcess. ExitCode) 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 reverso no. NET porque você deve iniciar um processo em um novo tópico se você 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 serão ativos. Codifique 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. MyProcess. WaitForExit (10000) 39 se o processo não for completado dentro de 39 10 segundos, mate-o Se não myProcess. HasExited Então myProcess. Kill () End If Threading. Thread. Sleep (1) Console. WriteLine (34Notepad terminou: 34 amp myProcess. ExitTime amp Environment. NewLine amp 34Exit Code: 34 amp myProcess. ExitCode) 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. Usando o myProcess As Process 61 Novo processo 39 Seu código vai aqui Finalizar o uso Para tornar ainda mais fácil trabalhar com isso, há mesmo um componente de processo que você pode adicionar ao seu projeto para que você possa fazer muitas das coisas mostradas acima no design Tempo 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. 39 permitem que o processo aumente eventos myProcess. EnableRaisingEvents 61 True 39 adicione um manipulador de eventos Excedido AddHandler myProcess. Exited, AddressOf Me. ProcessExited Private Sub ProcessExited (ByVal sender As Object, ByVal e As System. EventArgs) 39 Seu código vai aqui End Sub Mas simplesmente selecionar o evento para o componente é muito mais fácil.

No comments:

Post a Comment