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 desencadeio 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 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á a questão 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 revelará o problema. Você pode trazer para uma reprodução de 5 linhas, duvido que você possa, mas vou olhar novamente se você fizer isso. Nos comentários, você especificou que o kill ping funciona, mas matar seu processo especial não. A causa disso geralmente não é cancelável IO. O kernel do Windows mantém processos ao redor até que todos os IO sejam feitos. 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 process handle usando a propriedade Process. Handle e aguarde 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 sempre. Respondeu 9 de setembro às 23: 00Leia o que o MSDN diz sobre isso: A sobrecarga WaitForExit () () () é usada para fazer o thread atual aguardar até o processo associado terminar. Este método instrui o componente Processo a aguardar uma quantidade infinita de tempo para que o processo saia. Isso pode fazer com que um aplicativo pare de responder. Por exemplo, se você chamar CloseMainWindow para um processo que tenha uma interface de usuário, a solicitação ao sistema operacional para encerrar o processo associado pode não ser tratada se o processo for gravado para nunca entrar no loop de mensagem. Esta sobrecarga garante que todo o processamento foi concluído, incluindo o tratamento de eventos assíncronos para a saída padrão redirecionada. Você deve usar essa sobrecarga após uma chamada para a sobrecarga WaitForExit (Int32) quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos. Isso é claro para o. NET. O que faz você pensar que não aguarda que o processo Note termine. Quais são os sinais disso. Qual é a prova sexta-feira, 20 de fevereiro de 2009 8:13 PM Não tenho certeza se isso mudou recentemente, mas de volta no dia aplicações na janela O celular nunca foi realmente fechado quando você bateu o X para fechá-los, eles apenas minimizariam e continuavam funcionando em segundo plano (isso não era um bug, era um recurso, já que na próxima vez que você iniciou o aplicativo, ele começaria muito rápido, yah Eu sei, insano, mas verdadeiro), então, por isso, o WaitForExit talvez esteja se comportando estranhamente e aguardando a inicialização do aplicativo em vez de sair. Mas, novamente, é apenas uma especulação baseada em conhecimentos de versões antigas do Windows Mobile. Sexta-feira, 20 de fevereiro de 2009 11:03 PM Id gostaria de colidir esta questão. Estou no Windows Mobile 6 Standard e estou tentando gerar uma instância de navegador. Gostaria de aguardar até o usuário fechar o navegador. Mas WaitForExit retorna extremamente rápido. Aqui está o código: Processo p novo Processo () p. StartInfo. Argumentos quotexample-sitequot p. StartInfo. Verb quotOpenquot p. StartInfo. UseShellExecute falso p. StartInfo. FileName quotIExplore. exequot p. Start () p. WaitForExit () MessageBox. Show (quotNow o navegador deve ser closedquot) Qual deve ser o caminho certo para obter os resubs esperados Segunda-feira, 08 de junho de 2009 10:45 PM Onde o símbolo é. símbolo. AlexB Terça, 09 de junho de 2009 9:58 PM Estou vendo o mesmo problema, mas no XP. Eu acho que a prova pode ser vista em qualquer depurador (como estou vendo), ou em qualquer aplicativo de console (não necessariamente no celular) quarta-feira, 02 de setembro de 2009 8:35 PM Exceto que você não obtém um objeto de processo que você pode usar. Se você tentar Dim myProc As New Process () myProc Process. Start (quotiexplorequot, quotfinance. yahooqhpsquot symbol) myProc. WaitForExit () Ele ainda retorna imediatamente. Quarta-feira, 02 de setembro de 2009 8:48 PM O problema é que você não está iniciando uma nova instância de iexplore. exe. Você está apenas criando uma nova janela no processo existente. O meu palpite é iexplore. exe começa, vê uma instância anterior e se comunica com a instância anterior para que ela abre a nova janela e, em seguida, a instância que você começou a sair imediatamente. Portanto, o comportamento é correto e esperado. Blog. voidnish quarta-feira, 2 de setembro de 2009 8:52 PM A Microsoft está realizando uma pesquisa on-line para entender sua opinião sobre o site da Msdn. Se você optar por participar, a pesquisa on-line será apresentada quando você deixar o site Msdn. Você gostaria de participar
No comments:
Post a Comment