Saturday 16 December 2017

C # process redirectstandardoutput waitforexit doesnt wait


Eu tenho uma situação onde eu quero executar um arquivo e, em seguida, excluir o arquivo executável quando a execução é 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 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 bloquear o arquivo executável mesmo após a chamada. WaitForExit () retorna. Eu encontrei outros threads na rede que descrevem o mesmo comportamento, mas eu não encontrei qualquer que concluir com uma razoável explicação ou solução para o problema, além de sugestões de colocar um Sleep (n) após WaitForExit (). Exemplos: Aqui está 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 também que o executável ss. exe é um simples aplicativo de console quotHello Worldquot simples. E a saída normalmente parece algo como (com quantidade variável de iterações antes do acidente ocorre): Qualquer idéia sobre por que isso acontece, e se houver alguma correção para isso (além de colocar dorme no código) Sexta-feira, 08 de janeiro de 2010 3 : 40 PM A razão é que, embora o processo seja concluído, pode demorar alguns milissegundos para o sistema operacional terminar de destruí-lo. É um sistema operacional multi-tarefa, afinal, está tentando atender a todos ao mesmo tempo. Infelizmente, não há maneira de saber quando o arquivo não está mais bloqueado (presicely). Quando você WaitForExit, você está criando um objeto de bloqueio no objeto de processo. O objeto de processo não pode ser destruído até que o bloqueio é liberado e você não pode esperar em algo que não existe (tipo de frango e ovo de questão). 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, 08 de janeiro de 2010 16:20 mudou para bool, loop infinito Correcção Sexta-feira, 08 de Janeiro de 2010 16:15 Microsoft está a realizar uma pesquisa online para compreender a sua opinião sobre o site Msdn. Se você optar por participar, o questionário on-line será apresentado a você quando você deixar o site Msdn. Você gostaria de participarAdicionar comando de saída 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 É útil para você 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 não seja visível Mais tempo, mas ainda em execução. É 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 atualizações para todos os seus clientes Tente Updater segunda-feira, 7 de setembro de 2009 8:58 Adicionar comando de saída 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 útil para você 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 você cria uma instância do cmd. Exe, ele inicia o processador de comandos. Redirecionar a entrada padrão e enviar um comando para o processo fará com que cmd. exe (processador de comandos) execute o comando eo comando será encerrado, mas o processador de comandos continuará em execução aguardando o próximo comando (isso é semelhante ao que acontece quando um usuário inicia O console de comando digitando cmd. exe no prompt de execução do Windows). Para fazer o console de comando sair, você tem que enviar o comando de saída 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 após 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 está conduzindo uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, o questionário on-line será apresentado a você quando você deixar o site Msdn. Gostaria de participar Ajude-nos a melhorar o MSDN. Visite a nossa página UserVoice para enviar e votar em ideias Centros de desenvolvimento Recursos de aprendizagem Community Support ProgramsProcess. WaitForExit () Não funciona RSS Process. WaitForExit () Não funciona Jun 01, 2004 07:30 PM 124 MCRen 124 LINK Eu tenho um formulário ASP. NET Que inicia um método assíncrono que rola através de uma lista de arquivos executáveis ​​e inicia-los fora No clique do botão eu chamo meu método assíncrono Meu método tem o seguinte loop Por algum motivo a espera para a saída doesnt parecem estar fazendo nada. Este laço não espera de todo. Se eu tiver 4 arquivos executáveis ​​quot. vbsquot, todos eles começam muito bem ao mesmo tempo. Quaisquer idéias sobre por que este doesnt parecem estar funcionando seria útil. Eu tentei executar isso a partir de um serviço do Windows e teve o mesmo problema. Eu devo estar esquecendo alguma coisa.

No comments:

Post a Comment