Thursday 21 December 2017

Redireccionar o teclado para verificar waitforexit


Eu tenho uma situação em que eu quero executar um arquivo e, em seguida, exclua o arquivo executável quando a execução estiver concluída. Eu uso System. Diagnostics. Process. Start () para executar o arquivo e use. WaitForExit () para aguardar a conclusão do processo. Eu então uso File. Delete (filename) para excluir o arquivo executável. O problema é que às vezes, File. Delete falhará com o seguinte erro: Isso me leva a acreditar que, de alguma forma, o processo ainda está vivo e bloqueando o arquivo executável mesmo depois que a chamada. WaitForExit () retorna. Eu encontrei outros tópicos na rede que descrevem o mesmo comportamento, mas não encontrei nenhum que conclua com uma explicação ou solução razoável para o problema, além das sugestões de colocar o Sleep (n) após o WaitForExit (). Exemplos: Aqui está um programa de exemplo que reproduz o problema para mim. Testei tanto no Windows XP quanto no Windows 7, e ambos, eventualmente, falharam em algum momento com o mesmo erro. Observe também que o executável ss. exe é um aplicativo simples e simples de console do quotHello Worldquot. E a saída geralmente parece ser uma coisa (com quantidade variável de iterações antes da ocorrência da falha): Qualquer idéia de por que isso acontece, e se houver alguma correção para isso (além de colocar dorme no código) sexta-feira, 8 de janeiro de 2010 3 : 40 PM O motivo é que, embora o processo seja concluído, pode demorar alguns milissegundos para que o sistema operacional termine de destruí-lo. É um sistema operacional multitarefa, está tentando atender todos ao mesmo tempo. Desnecessariamente, não há como saber quando o arquivo não está mais bloqueado (presitivamente). Quando WaitForExit, você está criando um objeto de bloqueio no objeto de processo. O objeto do processo não pode ser destruído até que o bloqueio seja liberado e você não pode esperar em algo que não existe (tipo de frango e ovo). Então, a única coisa razoável que você pode fazer é continuar tentando, algo como: Marcado como resposta por Samuel Stanojevic sexta-feira, 08 de janeiro de 2010 16:20 Editado por Tergiver sexta-feira, 8 de janeiro de 2010 4:20 PM mudou para bool, loop infinito Revisão sexta-feira, 08 de janeiro de 2010 16:15 A Microsoft está realizando 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ê deixar o site Msdn. Gostaria de participarElina: obrigado pela sua resposta. Existem 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 essa questão. 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 mais moderna, Tarefa paralela (TPL), baseada em solução para 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 também o seu código ou talvez algo equivalente ao quotggsci. exequot do quot quotgbsci. exequot se você realmente não quiser usar um arquivo obeycommand. txt separado. Ndash Amit Naidu Jun 4 13 em 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 7 de novembro 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 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 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 bug relacionado à leitura de fluxo de saída de processo assíncrono. 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 você 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 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.

No comments:

Post a Comment