Wednesday, 5 February 2020

O processo waitforexit não funciona


NET System. Diagnostics. Processo Classe 8211 Parte 1 Process. WaitForExit e. Exited evento aren8217t working Eu pensei que eu tinha encontrado este para ser o caso, mas foi minha culpa, provavelmente o mesmo para você também. Eu examinarei o que encontrei ao explorar e solucionar esse problema. Resposta curta: se você estiver redirecionando o StandardOutput e o StandardError, use os métodos assíncronos Process. BeginErrorReadLine () e. BeginOutputReadLine () ANTES de chamar. WaitForExit () e capture a saída conectando os eventos Process. ErrorDataReceived e. OutputDataReceived. A resposta longa começa comigo usando o Visual Studio diffmerge. exe na pasta Common7IDE para comparar arquivos de texto no modo de lote. Estou apresentando um teste de regressão em um processo de lote iniciado por compilação. Eu precisava de uma ferramenta que cuspiria um arquivo de diferença de texto ao comparar dois arquivos (não um arquivo de resultado de mesclagem). WinMerge e Beyond Compare estão à minha disposição, mas eles não parecem produzir nada além de resultados mesclados (o que normalmente é o que eu quero, mas não desta vez). Minha estrutura de regressão chamará diffmerge. exe e armazenará o arquivo diff resultante para posterior revisão. Eu codifiquei o meu ProcessStartInfo Seguiu isso com o início do processo e aguardando o encerramento do processo. E aguarde espera. Isso me fez ler MSDN e cavando mais fundo no uso da classe Process. Descobri algumas informações interessantes, provavelmente deveria ter sido óbvio. Primeiro, descobri que, às vezes, funcionava o meu Diferente Processo Infantil com diferentes argumentos trabalhados, às vezes não fazia, tornando o assunto misterioso. Em segundo lugar, achei que funcionou bem quando não escrevi a saída de redirecionamento. Então, obviamente eu estava perdendo alguma coisa. Eu precisava realmente ler os Doccs da API de Processo e, assim, encontrei esse nugget: Artigo do MSDN Depois de encontrar e ler esse artigo do MSDN, entendi. O meu exemplo de código acima funcionará se o buffer StdOut ou StdError não preencher. No entanto, o que eu estava vendo era o buffer StdOut preenchendo, o processo filho foi bloqueado na próxima gravação StdOutStdError, o processo pai estava esperando infinitamente no processo filho para sair antes de ler o buffer StdOutStdError. Para mim, pareceu que o método WaitForExit e o evento Exited estão quebrados, não apanhando o processo filho, mas era meu código que estava quebrado. Eu modifiquei o código para usar os métodos assíncronos e, de repente, meus problemas desapareceram. Não há mais bloqueio, tudo funcionou como esperado. Eu usei StringBuilders como buffers para armazenar os dados recebidos nos eventos. Na parte 2, eu enfrento um problema com as implementações Process StdOutStdError ReadLine em torno de minhas necessidades específicas, entro em como resolvi esse problema. Estou escrevendo um programa que inicia uma quantidade desconhecida de processos em sequência usando myProcess. Start () e myProcess. WaitForExit (). O problema parece ser que alguns processos podem iniciar outros processos e, em seguida, sair, fazendo com que meu programa continue sem o processo iniciado, na verdade, completando sua tarefa. Existe alguma maneira de monitorar esses quotsub-processesquot Obrigado de antemão Editar: depois de alguns testes adicionais, descobri que o mesmo problema ocorre quando, por exemplo, iniciando o Winword. exe. WaitForExit simplesmente não funciona com alguns aplicativos. Tom escreveu sobre o mesmo problema neste tópico, mas ficou satisfeito quando trabalhou em um computador diferente. Parece que um processo quotWINWORD. EXEquot já está sendo executado na minha máquina. Possivelmente porque eu uso o Word como editor de e-mail (). Fechando isto antes de executar meu programa (que está configurado para iniciar a palavra e aguardar a saída) quotsolvesquot o problema. No entanto, eu não posso assumir que winword não está sendo executado quando o meu programa é iniciado. Quinta-feira, 09 de agosto de 2007 8:01 am Não, não há muito que você possa fazer de forma confiável. O problema é que, no momento em que você chama WaitForExit, o aplicativo talvez já tenha iniciado outro aplicativo e tenha saído não há como saber se esse aplicativo gerou outras pessoas nesse ponto. É a natureza do Process. Start. Você não está descobrindo que WaitForExit espera indefinidamente porque o processo veio e foi antes de você chamar você é quinta-feira, 09 de agosto de 2007 1:15 PM Bem, ele cria um novo processo, é tão rápido que não pode aparecer em processo Explorador. Todo Process. Start faz é pedir ao processo para iniciar não há nada mais que o novo processo é obrigado a fazer. Se não quer ficar na memória, essa é a escolha. Não há nada que você possa fazer sobre isso, infelizmente. Algumas aplicações sempre iniciam um novo processo. Quando você abre um arquivo Visual Studio SLN, por exemplo, ele sempre inicia dois processos. Existe uma pequena aplicação que verifica o tipo de arquivo SLN e, em seguida, abre uma versão apropriada do Visual Studio porque você só pode associar uma aplicação por extensão. A outra questão é que algumas aplicações podem lidar com vários documentos de cada vez, o que significa que eles geralmente reutilizam os processos existentes. Em casos como este, se o processo for reutilizado porque um documento já estava aberto, isso significa que o documento que você abriu com Process. Start pode ser fechado, mas o processo de hospedagem ainda está sendo executado (atendendo o documento original), o que significa que você nunca pode Diga quando o processo que foi reutilizado quando você chamou Process. Start é feito com o documento que foi aberto com seu Process. Start. Se você quiser integrar algum tipo de solução do WinWord, eu sugiro usar a automação. Consulte msdn. microsoftnewsgroupsdefault. aspxdgmicrosoft. public. officedevamplangenampcrUS para discussões sobre a automação de produtos do Office. Quinta-feira, 09 de agosto de 2007 13:37 Você precisaria acompanhar quantos processos foram lançados e usá-lo em sua lógica. Você também pode usar o WaitForMultipleObjects se você souber de antemão, aproximadamente, quantos processos serão iniciados. O tempo que um processo inicia, o processo bloqueia um objeto e incrementa o contador. Sempre que o processo termina, bloqueia o objeto e diminui o contador. Quando o processo foi disparado x quantidade de vezes, foi solicitado a esperar que ele acordasse, bloqueia o objeto e verifica para ver quantos objetos estão lá e que espera por esse número de objetos novamente. Quinta-feira, 09 de agosto de 2007 12:39 PM Não, não há muito o que você pode fazer de forma confiável. O problema é que, no momento em que você chama WaitForExit, o aplicativo talvez já tenha iniciado outro aplicativo e tenha saído não há como saber se esse aplicativo gerou outras pessoas nesse ponto. É a natureza do Process. Start. Você não está achando que WaitForExit espera indefinidamente porque o processo veio e foi antes de você chamar você é quinta-feira, 09 de agosto de 2007 1:15 PM Não, eu espero que a situação não ocorra (É mesmo possível que Havent pensou antes). . De qualquer forma, isso responde claramente a um dos problemas. Obrigado. Mas deve haver uma súbita questão sobre o início do winword. exe (e similar) que. Nenhum processo extra é mostrado no taskmanager (mas ainda a palavra aparece). Quero forçar a criação de um novo processo que eu possa controlar. Quinta-feira, 09 de agosto de 2007 1:25 PM Bem, ele cria um novo processo, é tão rápido que não pode aparecer no Process Explorer. Todo Process. Start faz é pedir ao processo para iniciar não há nada mais que o novo processo é obrigado a fazer. Se não quer ficar na memória, essa é a escolha. Não há nada que você possa fazer sobre isso, infelizmente. Algumas aplicações sempre iniciam um novo processo. Quando você abre um arquivo Visual Studio SLN, por exemplo, ele sempre inicia dois processos. Existe uma pequena aplicação que verifica o tipo de arquivo SLN e, em seguida, abre uma versão apropriada do Visual Studio porque você só pode associar uma aplicação por extensão. A outra questão é que algumas aplicações podem lidar com vários documentos de cada vez, o que significa que eles geralmente reutilizam os processos existentes. Em casos como este, se o processo for reutilizado porque um documento já estava aberto, isso significa que o documento que você abriu com Process. Start pode ser fechado, mas o processo de hospedagem ainda está sendo executado (atendendo o documento original), o que significa que você nunca pode Diga quando o processo que foi reutilizado quando você chamou Process. Start é feito com o documento que foi aberto com seu Process. Start. Se você quiser integrar algum tipo de solução do WinWord, eu sugiro usar a automação. Consulte msdn. microsoftnewsgroupsdefault. aspxdgmicrosoft. public. officedevamplangenampcrUS para discussões sobre a automação de produtos do Office. Quinta-feira, 09 de agosto de 2007 1:37 PM Bem, é verdade que o enquadramento não permite encontrar os subprocessos diretamente, algo pode ser combinado. Você pode obter o Pid do processo que você iniciou e, em seguida, usando o PInvoke, você pode descobrir o Pid principal de todos os processos em execução e compará-los. Você pode esperar por essas sub preocupações para sair. Aqui está um exemplo de C usando a API. Você gostaria de procurar algo como Pinvoke para como convertê-lo quinta-feira, 09 de agosto de 2007 16:20 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