Msiexec Waitforexit Doesnt Wait




Msiexec 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 ira falhar 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, a pesquisa on-line sera apresentada 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, a pesquisa on-line sera apresentada 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 ProgramsLancamento do MSIExec. exe A partir do CI surgiu um problema ao tentar gerar um processo para iniciar um comando MSIExec. exe a partir do C.160 Eu queria iniciar o processo E depois esperar por ele para terminar antes de prosseguir no entanto, 160 sempre foi retornado imediatamente antes da instalacao ou desinstalacao foi realmente finished.160 Eu confirmei este comportamento com esta entrada de blog: 160 blogs. msdn / heaths / archive / 2005/11/15 /493236.aspx O autor sugere quot start / wait quot que funciona a partir da linha de comando ou um arquivo em lote.160 Eu verifiquei que ele funciona lancando um arquivo em lote ou dois de C, mas eu preferi manter em C tanto quanto possivel. 160 Alem disso, eu estava tentando realizar um processo em segundo plano silencioso executando os comandos MSIExec.160 No entanto, C can8217t apenas iniciar um processo chamado quot start, quot que e um comando interno para o prompt de comando eu acho. Alguem me lembrou em uma placa de mensagem que voce pode iniciar um processo usando CMD. exe. Chamar quot iniciar quot como este: Ele funciona como um charme.160 Eu don8217t acho que voce ainda precisa da bandeira quot / MIN quot para quot iniciar quot de qualquer maneira. Comentarios Obrigado por isso. Boa ideia. Trabalhou para mim. Voce poderia usar process. WaitForExit () isn39t ele copia de direitos autorais 2012 Mike Murray Credito do projeto: Shashank Mehta codigo por favor responsavel