Sunday 5 May 2019

Waitforexit process c 22


Eu tenho um processo que é executado em segundo plano e tem WaitForExit (). Uma vez que a duração pode variar e preciso aguardar até terminar. Em ocasiões, preciso terminar antes de completar e desencadear o comando. Kill () através de um evento de classe. A propriedade. HasExited muda para true, mas o código nunca passa a linha WaitForExit (). Meu processo lança um cliente de transferência de arquivos baseado em java e executa uma transferência. O processo aparece no gerenciador de tarefas e Kill () não termina. Como eu realmente não me importo com o encerramento do processo, mas preciso do meu programa para a próxima tarefa, adicionei Close () logo após Kill (). Que libera o WaitForExit e deixa meu código seguir em frente. Terminar o processo cedo será uma ocorrência rara no meu aplicativo, mas ainda preciso que ele funcione, então essa implementação terá que fazer. Perguntou 9 de setembro às 21:15 WaitForExit é uma chamada direta para o sistema operacional para aguardar a sinalização do process handle. Quando um processo termina, o WaitForExit será concluído. Kill é uma chamada direta para TerminateProcess, que é uma matança sem perguntas. Se usado corretamente, WaitForExit retornará depois que Kill for concluída. Então, há algum outro erro em seu código. Crie uma reprodução mais simples e você verá o problema desaparecer. O bug está escondido na complexidade do seu código. Ou, WaitForExit retornou, mas você não percebeu. Ou, Kill nunca foi executado ou falhou. Mais uma vez, a simplificação do código irá revelar o problema. Você pode trazer para uma reprodução de 5 linhas, eu duvido que você possa, mas eu vou olhar novamente se você fizer isso. Nos comentários, você especificou que o ping de matar funciona, mas matar seu processo especial não. A causa disso geralmente não é cancelável IO. O kernel do Windows mantém os processos até que todas as IO sejam feitas. A boa notícia é que o processo irá morrer eventualmente e nenhum código será executado depois que Kill tenha retornado. A má notícia é que a limpeza de recursos não está totalmente concluída. Agora você precisa garantir que seu código possa seguir em andamento, embora WaitForExit não tenha retornado. Para fazer isso, configure um ManualResetEvent após a conclusão de Kill. E em vez de chamar WaitForExit. Você obtém o identificador de processo usando a propriedade Process. Handle e aguarde em qualquer um dos dois waitables para se sinalizar. Veja o que WaitForExit faz internamente para ver como você poderia implementar isso sozinho (Id copiar a classe ProcessWaitHandle que é interna). Uma solução mais simples seria chamar WaitForExit (TimeSpan. FromMilliseconds (100)) em um loop e verifique o sinalizador excluído a cada vez. Respondeu 9 de setembro às 23: 00h Estou tendo um problema com isso e espero que alguns de vocês possam esclarecer alguma coisa para mim. O bloco de código: eu alterei o URL, obviamente, mas isso não é importante. Quando eu tento executá-lo, isso me dá uma exceção na linha quotWaitForExitquot indicando quotNão processo está associado a este objeto. quot Qualquer ajuda aqui seria muito apreciada Terça, 19 de outubro de 2018 18:05 O nome do arquivo do processo deve ser arquivo executável MBoardProcess. StartInfo. Argumentos microsoftenusdefault. aspx mBoardProcess. StartInfo. FileName quotIEXPLORE. EXEquot CÓDIGO CONVERTIDOR SITE Editado por kaymaf terça-feira, 19 de outubro de 2018 18:32 Marcado como resposta por Frank L. Smith terça-feira, 19 de outubro de 2018 18:35 Terça-feira, 19 de outubro , 2018 6:26 PM

No comments:

Post a Comment