Tuesday 23 May 2017

Waitforexit Process C # Exemplo


Elina: obrigado pela sua resposta. Há algumas notas na parte inferior deste MSDN doc (msdn. microsoften-uslibraryhellip) que alertam sobre potenciais bloqueios se você ler ao final de ambos os fluxos stdout e stderr redirecionados de forma síncrona. É difícil dizer se sua solução é suscetível a esse problema. Além disso, parece que você está enviando o process39 stdoutstderr output novamente na entrada. Por quê. ) Ndash Matthew Piatt 26 de setembro 16 às 4:42 Esta é uma solução mais moderna, Tarefa paralela (TPL), baseada em solução para 4.5 e acima. Exemplo de uso Implementação respondida 5 de outubro 16 às 10:54 Eu acho que isso é uma abordagem simples e melhor (não precisamos de AutoResetEvent): respondido 14 de junho 12 às 14:29 Verdadeiro, mas não deveria estar fazendo. FileName Path quotggsci. exequot quot lt Obeycommand. txtquot para simplificar o seu código também Ou talvez algo equivalente a quotggsci. exequot do quot do comando quotecho se você realmente não quiser usar um arquivo obeycommand. txt separado. Ndash Amit Naidu Jun 4 13 at 22:03 Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz uma pesquisa em vez de usar o evento (quando está disponível), você está usando a CPU sem motivo e isso indica que você é um programador ruim. Sua solução é realmente ruim quando comparada com a outra usando AutoResetEvent. (Mas não te dou -1 porque voce tentou ajudar). Ndash Eric Ouellet Nov 7 14 às 18:38 Eu estava tendo o mesmo problema, mas a razão era diferente. No entanto, isso aconteceria no Windows 8, mas não no Windows 7. A seguinte linha parece ter causado o problema. A solução era NÃO desativar UseShellExecute. Agora recebi uma janela popup do Shell, que é indesejável, mas muito melhor do que o programa esperando que nada de particular aconteça. Então eu adicionei o seguinte trabalho para isso: agora, o único problema que me incomoda é o porquê isso está acontecendo no Windows 8, em primeiro lugar. Respondeu 13 de janeiro 15 às 10:35 Tentei fazer uma aula que resolva seu problema usando a leitura de fluxo assíncrono, levando em conta Mark Byers, Rob, Stevejay responde. Ao fazê-lo, percebi que existe um bug relacionado à leitura assíncrona do fluxo de saída do processo. Você não pode fazer isso: você receberá System. InvalidOperationException. StandardOut não foi redirecionado ou o processo ainda não começou. Então, você deve iniciar a saída assíncrona lida depois que o processo for iniciado: fazendo isso, faça uma condição de corrida porque o fluxo de saída pode receber dados antes de configurá-lo como assíncrono: então, algumas pessoas podem dizer que você só precisa ler o fluxo antes de você Configure-o para assíncrono. Mas o mesmo problema ocorre. Haverá uma condição de corrida entre a leitura síncrona e configurará o fluxo em modo assíncrono. Não há como obter uma leitura assíncrona segura de um fluxo de saída de um processo da maneira atual Process e ProcessStartInfo foi projetado. Você provavelmente está melhor usando a leitura assíncrona, como sugerido por outros usuários para o seu caso. Mas você deve estar ciente de que você pode perder algumas informações devido à condição da raça. Estou escrevendo um programa que inicia um número desconhecido 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 algum teste adicional, 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 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, não posso assumir que o winword não esteja sendo executado quando o meu programa for 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 não tenha havido nenhuma maneira de saber se esse aplicativo gerou outros no momento. É 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 é sua 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 um pequeno aplicativo que verifica o tipo do arquivo SLN e, em seguida, abre uma versão apropriada do Visual Studio porque você só pode associar um aplicativo 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 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 Você precisaria acompanhar a quantidade de processos que foi lançado e usar isso 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 terminar, bloqueia o objeto e diminui o contador. Quando o processo foi desencadeado x quantidade de vezes, foi solicitado a aguardar que 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 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 não tenha havido nenhuma maneira de saber se esse aplicativo gerou outros no momento. É 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 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, 9 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 é sua 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 um pequeno aplicativo que verifica o tipo do arquivo SLN e, em seguida, abre uma versão apropriada do Visual Studio porque você só pode associar um aplicativo 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 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, 9 de agosto de 2007 1:37 PM Bem, é verdade que o trabalho 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 pai Pid 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ê quer ver algo como Pinvoke para como convertê-los 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