C # Process Redirectstandardoutput Waitforexit Doesnt Wait




C # Process Redirectstandardoutput Waitforexit Doesnt WaitEu tenho uma situacao onde eu quero executar um arquivo e, em seguida, excluir o arquivo executavel quando a execucao e feita. Eu uso System. Diagnostics. Process. Start () para executar o arquivo, e usar. WaitForExit () para aguardar o processo para concluir. Em seguida, uso File. Delete (filename) para excluir o arquivo executavel. O problema e que, as vezes, File. Delete falhara com o seguinte erro: Isso me leva a acreditar que, de alguma forma, o processo ainda esta vivo e bloquear o arquivo executavel mesmo apos a chamada. WaitForExit () retorna. Eu encontrei outros threads na rede que descrevem o mesmo comportamento, mas eu nao encontrei qualquer que concluir com uma razoavel explicacao ou solucao para o problema, alem de sugestoes de colocar um Sleep (n) apos WaitForExit (). Exemplos: Aqui esta um programa de exemplo que reproduz o problema para mim. Eu testei no Windows XP e no Windows 7, e ambos eventualmente falham em algum ponto com o mesmo erro. Observe tambem que o executavel ss. exe e um simples aplicativo de console quotHello Worldquot simples. E a saida normalmente parece algo como (com quantidade variavel de iteracoes antes do acidente ocorre): Qualquer ideia sobre por que isso acontece, e se houver alguma correcao para isso (alem de colocar dorme no codigo) Sexta-feira, 08 de janeiro de 2010 3 : 40 PM A razao e que, embora o processo seja concluido, pode demorar alguns milissegundos para o sistema operacional terminar de destrui-lo. E um sistema operacional multi-tarefa, afinal, esta tentando atender a todos ao mesmo tempo. Infelizmente, nao ha maneira de saber quando o arquivo nao esta mais bloqueado (presicely). Quando voce WaitForExit, voce esta criando um objeto de bloqueio no objeto de processo. O objeto de processo nao pode ser destruido ate que o bloqueio e liberado e voce nao pode esperar em algo que nao existe (tipo de frango e ovo de questao). Entao, a unica coisa razoavel que voce pode fazer e continuar tentando, algo como: Marcado como resposta por Samuel Stanojevic Sexta-feira, 08 de janeiro de 2010 16:20 Editado por Tergiver sexta-feira, 08 de janeiro de 2010 16:20 mudou para bool, loop infinito Correccao Sexta-feira, 08 de Janeiro de 2010 16:15 Microsoft esta a realizar uma pesquisa online para compreender a sua opiniao sobre o site Msdn. Se voce optar por participar, o questionario on-line sera apresentado a voce quando voce deixar o site Msdn. Voce gostaria de participarAdicionar comando de saida na sua lista de comandos: System. Diagnostics. ProcessStartInfo si new System. Diagnostics. ProcessStartInfo (quotcmd. exequot) si. RedirectStandardInput true si. RedirectStandardOutput true si. RedirectStandardError true si. UseShellExecute false si. CreateNoWindow true si. WindowStyle System. Diagnostics. ProcessWindowStyle. Hidden System. Diagnostics. Process console System. Diagnostics. Process. Start (si) console. StandardInput. WriteLine (quotsome commandsquot) console. StandardInput. WriteLine (quotEXITquot) Por favor, marque a postagem como resposta se ele E util para voce porque aumenta os membros a responder mais e mais. Sugerido como resposta por SuDhiR segunda-feira, 7 de setembro de 2009 10:26 Marcado como resposta por YiChun Chen segunda-feira, 14 de setembro de 2009 2:29 segunda-feira, 7 de setembro de 2009 8:59 Todas as respostas Talvez o aplicativo nao seja visivel Mais tempo, mas ainda em execucao. E o valor de retorno do console. WaitForExit () verdadeiro ou falso Geert van Horrik - CatenaLogic Visite meu blog: blog. catenalogic Procurando uma maneira de implantar suas atualizacoes para todos os seus clientes Tente Updater segunda-feira, 7 de setembro de 2009 8:58 Adicionar comando de saida na lista de comandos: System. Diagnostics. ProcessStartInfo si new System. Diagnostics. ProcessStartInfo (quotcmd. exequot) si. RedirectStandardInput true si. RedirectStandardOutput true si. RedirectStandardError true si. UseShellExecute false si. CreateNoWindow true si. WindowStyle System. Diagnostics. ProcessWindowStyle. Hidden System. Diagnostics. Process console System. Diagnostics. Process. Start (si) console. StandardInput. WriteLine (quotsome commandsquot) console. StandardInput. WriteLine (quotEXITquot) Por favor, marque a postagem como resposta se for util para voce Porque ele estimula os membros a responder cada vez mais. Proposta como resposta por SuDhiR segunda-feira, 7 de setembro de 2009 10:26 Marcada como resposta por YiChun Chen Segunda-feira, 14 de setembro de 2009 2:29 Segunda-feira, 07 de setembro de 2009 8:59 Quando voce cria uma instancia do cmd. Exe, ele inicia o processador de comandos. Redirecionar a entrada padrao e enviar um comando para o processo fara com que cmd. exe (processador de comandos) execute o comando eo comando sera encerrado, mas o processador de comandos continuara em execucao aguardando o proximo comando (isso e semelhante ao que acontece quando um usuario inicia O console de comando digitando cmd. exe no prompt de execucao do Windows). Para fazer o console de comando sair, voce tem que enviar o comando de saida especificamente para o processador de comando (como sugerido por SuDhiR) ou fazer o seu comando um arquivo em lotes e executar o arquivo em lotes em vez de cmd. exe. Segunda-feira, 7 de setembro de 2009 9: 17 Adicionar / c para os argumentos de linha de comando para cmd. exe automaticamente sai apos executar os comandos. Hans Passant. Marcado como resposta por YiChun Chen Monday, September 14, 2009 2:28 AM Monday, September 07, 2009 9:30 AM A Microsoft esta conduzindo uma pesquisa on-line para entender sua opiniao sobre o site da Msdn. Se voce optar por participar, o questionario on-line sera apresentado a voce quando voce deixar o site Msdn. Gostaria de participar Ajude-nos a melhorar o MSDN. Visite a nossa pagina UserVoice para enviar e votar em ideias Centros de desenvolvimento Recursos de aprendizagem Community Support ProgramsProcess. WaitForExit () Nao funciona RSS Process. WaitForExit () Nao funciona Jun 01, 2004 07:30 PM 124 MCRen 124 LINK Eu tenho um formulario ASP. NET Que inicia um metodo assincrono que rola atraves de uma lista de arquivos executaveis ??e inicia-los fora No clique do botao eu chamo meu metodo assincrono Meu metodo tem o seguinte loop Por algum motivo a espera para a saida doesnt parecem estar fazendo nada. Este laco nao espera de todo. Se eu tiver 4 arquivos executaveis ??quot. vbsquot, todos eles comecam muito bem ao mesmo tempo. Quaisquer ideias sobre por que este doesnt parecem estar funcionando seria util. Eu tentei executar isso a partir de um servico do Windows e teve o mesmo problema. Eu devo estar esquecendo alguma coisa.