Eu tenho o seguinte código: Process. Kill está lançando a seguinte exceção: O código geralmente funciona, mas o tempo estranho ele falhar. Sua parte de uma ação personalizada em um instalador que eu construí, e quando ele é executado é executado sob a conta do sistema local. Eu vi isso acontecer com Process. Kill no passado. Eu sei que existem algumas alternativas para ele. Eu não posso modificar o código do processo em questão, por isso estou no meu próprio para terminá-lo, no entanto, eu vejo o ajuste. Qual é o melhor método de nuking um processo que precisa morrer o mais rápido possível se eu não me importo em deixá-lo em algum estado intermediário, porque eu estou desinstalando seus arquivos do sistema Qualquer IO deve ser autorizado a terminar ou ser cancelado no caso de quaisquer configurações estão em O processo de ser definido para o aplicativo em um nível global eo usuário faz uma atualização. P / Invocando TerminateProcess será a melhor solução pedida Mar 16 15 at 18:38 sthotakura Sim, eu faço algumas chamadas para Process. Kill para tentar matar esse processo, então isso faz sentido. Parece que o processo não morre em tudo embora. Inicialmente, eu chamei Process. Kill sobre ele, então novamente após 5 segundos, e depois novamente após outros 5 segundos. Eu posso matar o processo bem agora, e eu posso matá-lo agora usando Process. Kill, mas durante esse período de tempo específico não iria morrer, apesar de entrar em um estado encerrado, quase como se a terminação foi cancelada. Ndash Alexandru Mar 16 15 at 18:56 Parece que o problema foi em parte minha culpa. Algo manteve reiniciando o processo, mas eu não era capaz de usar o método GetProcesses () para enumerar e ver essa alteração de processos ativos do lado do instalador de coisas porque (como se mostra) eu não estava funcionando sob a conta SYSTEM, mas em outra conta , E por alguma razão (que eu não posso explicar TBH) que o método não me deu os processos ativos de volta. Eu executei minha ação personalizada usando SYSTEM, definindo Executequotdeferredquot Impersonatequotnoquot e funcionou, e eu era capaz de matar meu processo uma segunda vez depois que ele tinha sido reiniciado. Ndash Alexandru Mar 16 15 às 21: 35Im tentando chamar um executável usando Process. Start e ele está jogando uma Exceção Win32 somente em máquinas Windows XP. Este é um aplicativo de console instalado na máquina. Heres um exemplo do código: Heres o rastreamento de pilha: SystemponentModel. Win32Exception (0x80004005): O acesso é negado em System. Diagnostics. Process. StartWithShellExecuteEx (ProcessStartInfo startInfo) em System. Diagnostics. Process. Start () em System. Diagnostics. Process. Start (ProcessStartInfo startInfo) Alguém tem algum conselho sobre como fazer isso funcionar em máquinas Windows XP pediu 23 de fevereiro às 21: 58Eu tenho uma situação onde eu quero executar um arquivo e exclua 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 irá 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 2018 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 2018 16:20 Editado por Tergiver sexta-feira, 08 de janeiro de 2018 16:20 mudou para bool, loop infinito Correcção Sexta-feira, 08 de Janeiro de 2018 16:15 Microsoft está a realizar uma pesquisa online para compreender a sua opinião sobre o site Msdn. Se você optar por participar, a pesquisa on-line será apresentada a você quando você deixar o site Msdn. Você gostaria de participar
No comments:
Post a Comment