воскресенье, 8 апреля 2018 г.

C # start process waitforexit


Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz poll em vez de usar event (quando eles estão disponíveis), então você está usando CPU sem motivo e isso indica que você é um mau programador. Sua solução é muito ruim quando comparada com a outra usando AutoResetEvent. (Mas eu não te dei -1 porque você tentou ajudar). ndash Eric Ouellet Nov 7 14 at 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 linha a seguir parece ter causado o problema. A solução foi NÃO desabilitar o UseShellExecute. Eu agora recebi uma janela popup do Shell, que é indesejada, mas muito melhor do que o programa esperando que nada de especial aconteça. Então eu adicionei a seguinte solução para isso: Agora, a única coisa que me incomoda é por que isso está acontecendo no Windows 8 em primeiro lugar. O que é que o MSDN diz sobre isso: A sobrecarga WaitForExit () () () é usada para fazer o thread atual esperar até que o processo associado termine. Este método instrui o componente Process a aguardar uma quantidade infinita de tempo para o processo sair. Isso pode fazer com que um aplicativo pare de responder. Por exemplo, se você chamar CloseMainWindow para um processo que tenha uma interface com o usuário, a solicitação para o sistema operacional finalizar o processo associado poderá não ser tratada se o processo for gravado para nunca inserir seu loop de mensagem. Essa sobrecarga assegura que todo o processamento tenha sido concluído, incluindo o tratamento de eventos assíncronos para 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 tiver sido redirecionada para manipuladores de eventos assíncronos. Isso é claro para o. NET. O que faz você pensar que não espera que o processo de anotação termine Quais são os sinais disso? Qual é a prova sexta-feira, 20 de fevereiro de 2009 20:13 Não tenho certeza se isso mudou recentemente, mas de volta ao dia os aplicativos na janela mobile nunca realmente fechado quando você aperta o X para fechá-los, eles apenas minimizam e continuam rodando em segundo plano (isso não foi um bug, foi um recurso, já que da próxima vez que você iniciar o app ele seria iniciado muito rápido, yah Eu sei, insano, mas é verdade), então pode ser por isso que o WaitForExit está se comportando de forma estranha e aguardando a inicialização do aplicativo em vez da saída. mas, novamente, é apenas especulação baseada no conhecimento de versões antigas do Windows Mobile. Sexta-feira, 20 de fevereiro de 2009 23:03 Eu gostaria de colocar essa questão em ordem. Estou no Windows Mobile 6 Standard e estou tentando gerar uma instância do navegador. Id gostaria de esperar até que o usuário feche o navegador. Mas WaitForExit retorna extremamente rápido. Aqui está o código: Processo p novo Process () p. StartInfo. Arguments quotexample-sitequote p. StartInfo. Verb quotOpenquot p. StartInfo. UseShellExecute falso p. StartInfo. FileName quotIExplore. exequot p. Start () p. WaitForExit () MessageBox. Show (quotNow o navegador deve ser fechado) O que deve ser o caminho certo para obter os resultados esperados Segunda, 8 de Junho de 2009 22: 45 Onde o símbolo está. símbolo. AlexB Terça-feira, 9 de junho de 2009 21:58 Estou vendo o mesmo problema, mas no XP. Eu acho que a prova pode ser vista em qualquer depurador (como eu estou vendo), ou em qualquer aplicativo de console (não necessariamente no celular) Quarta-feira, 02 de setembro de 2009 20:35 Exceto que você não, em seguida, obter um objeto de processo que você pode usar. Se você tentar Dim myProc como novo processo () myProc Process. Start (quotiexplorequot, quotfinance. yahoo/q/hpsquot símbolo) myProc. WaitForExit () Ele ainda retorna imediatamente. Quarta-feira, 2 de setembro de 2009 20:48 Problema é que você não está iniciando uma nova instância do iexplore. exe. Você está apenas criando uma nova janela no processo existente. Meu palpite é que o iexplore. exe inicia, vê uma instância anterior e se comunica com a instância anterior para que abra a nova janela e, em seguida, essa instância iniciada sai imediatamente. Portanto, o comportamento está correto e é esperado. A Microsoft está realizando uma pesquisa online para entender sua opinião sobre o site da MSDN. Se você optar por participar, a pesquisa on-line será apresentada quando você sair do site do Msdn. Você gostaria de participar? Essa pergunta pode parecer um pouco estranha, mas estou tentando executar o VS2005 através de um processo e executar um comando específico e waitforexit (). Estou redirecionando minha entrada e saída com sucesso, mas de vez em quando recebo uma Janela / Mensagem de Relatório de Erros da Janela. O problema é que eu estou remoting, então quando esta mensagem / janela ocorre durante a execução do processo, eu vou desligar a menos que eu faça o login na outra máquina (remoting) e feche a janela. Existe alguma maneira de matar programaticamente esta janela ou possivelmente desativar a mensagem / janela ocorra pensei em executar o VS em uma execução silenciosa (eu ainda tenho que encontrar uma maneira de fazer isso). Eu também tentei ver se há alguma coisa sendo lançada quando isso ocorre, comparado a quando isso não acontece. Quinta-feira, 25 de outubro de 2007 20:32 Bem, tentei usar FindWindow e FindWindowEx junto com SendMessage, mas não consegui encontrar o identificador de janela correto. Mas, como sei que uma Caixa de Mensagens do Relatório de Erros do Windows será exibida, verifiquei se era seu próprio processo (e é). O processo é dwwin. exe (Dr. Watson Win) e tudo o que eu tinha que fazer era permitir que eu corrigisse o problema atual. Substitua o bloco de código atual abaixo pela instrução WaitForExit () que eu tinha anteriormente. proc. WaitForExit (60000) // um minuto Process ProcArray Process. GetProcessesByName (quotdwwinquot) foreach (Process ProcessFound no ProcArray) Também verifiquei se você conseguiu obter o Process. MainWindowTitle (), mas ele está definido como quotquot. Então isso é um hack e eu realmente não gosto de usá-lo, mas funciona para a execução atual. Segunda-feira, 29 de outubro de 2007 19:26 Não, eu posso redirecionar entrada e saída sem nenhum problema. O erro que estou recebendo é o relatório de erro geral do Windows e, infelizmente, é em japonês, então eu não sei qual é o erro exato, mas é o erro geral. Eu não tenho o código na frente de mim, mas eu configurei delegados / threads para ler redirecionado o erro e saída depois de sair de todo o processo. Não consigo fazer nada e posso executar o mesmo processo no meu próprio computador, mas não consigo fazer esse comando específico por meio de comunicação remota. Eu tentarei isso amanhã, remotando em uma máquina não japonesa no trabalho e postarei minhas descobertas de qualquer maneira. Sexta-feira, 26 de outubro de 2007 2:34 AM Você está executando o console quotcmdquot. Se sim, então você tem que digitar exit também. Sexta-feira, 26 de outubro de 2007 4:50 AM Se você tiver uma idéia de quanto tempo o processo levará, você pode usar bool exit process. WaitForExit (timeInMilliSeconds) if (exitted) // Processo encerrado antes do tempo limite. else // Imprimir mensagem de erro Isso pode não estar relacionado ao que você está fazendo, mas eu tive uma experiência em que o processo não sairia se eu redirecionasse sua saída. Tente desabilitar o redirecionamento de saída e ver se o processo sai. Experimente, pode funcionar. Sexta-feira, 26 de outubro de 2007 11:58 Eu gostaria de tentar isso, mas é muito de um hack. Eu tenho muitos comandos diferentes que levam diferentes quantidades de tempo (30 segundos a 25 minutos) para que não haja configuração em tempo real que eu possa colocar sem destruir meu desempenho. Esta função tem funcionado corretamente para vários comandos nos últimos 6 meses e agora ela decide sair por mim. Eu tentei em um computador diferente sem problemas (o que realmente está mexendo comigo). Eu sei que não é o redirecionamento de saída / erro porque um novo WINDOW está sendo criado no servidor que eu estou remoting. Assim que fecho essa janela, meu processo sai como esperado e a saída correta é exibida no lado do usuário. Obrigado por sua ajuda, mas estou ficando realmente frustrado com esse problema. Sexta-feira, 26 de outubro de 2007 15:01 Sem saber o detalhe da mensagem, apenas adivinhando o problema. Você já instalou o. NET 3.5 beta ou o Visual Studio 2008 beta? Como você está usando o Processo para iniciar o programa, Process. Start (quotfile. exequot), ou está usando ProcessStartInfo sexta-feira, 26 de outubro de 2007 15:21 Não, Eu tenho o. NET 2003 e. NET 2005 instalado. proc new Process () procSI new ProcessStartInfo () Eu, então, configurei um novo thread para o StandardError e o StandardOutput I, em seguida, escrevo meus comandos e se (redirecionando o padrão para fora) Start thread para st. out If (redirecionando o erro padrão) Start thread for st. error Proc. WaitForExit () lt -------- é onde ocorre a janela Relatório de Erros Genérico do Windows. Traduzi o que pude da janela que aparece. Microsoft Visual Studio 2005 Como o problema ocorre, ele encerra o Microsoft Visual Studio 2005. Aplicamos a inconveniência, não há desculpa. Obrigado novamente por todo o seu tempo. Eu criei o StreamWriter sIn antes de criar o objeto Process do processo. Eu, então, redirecionar a entrada após o comando proc. Start (), então como eu não possuo isso Independentemente, eu posso fazer a mudança para mover o sIn. Close () para depois da chamada WaitForExit para ver se isso faz qualquer alteração. O Proc foi um tipo, deveria ter sido proc. Novamente, não é uma mensagem de erro, portanto, não há rastreamento de pilha. Meu redirecionamento StandardError está vazio e o redirecionamento de saída padrão contém o que eu esperava, mas nada indicando um erro. É por isso que tudo ainda funciona depois de fechar a janela Relatório de erros do Windows. Vou postar o que acontece depois de mover a linha sIn. Close () abaixo da linha WaitForExit (). Sexta-feira, 26 de outubro de 2007 16:59 Peter Ritchie escreveu: Você não quer fechar o objeto sIn até que o aplicativo seja encerrado se você estiver redirecionando. Não se deve fechar nenhum desses fluxos. O objeto Process possui-os e é o responsável pela limpeza após ele mesmo. Deve-se, na melhor das hipóteses, chamar Process. Dispose () depois de terminar com o objeto Process. Você certamente não precisa (ou seja, é redundante), mas não deve causar um problema após o processo ter sido encerrado. Process. Close é o método recomendado para fechar os fluxos padrão de entrada e saída padrão (e padrão). Sexta-feira, 26 de outubro de 2007 17:03 Eu ficaria surpreso se o método Dispose não chamasse Close, pelo menos como parte de sua operação. Eu preferiria usar o fato de que, como o Process implementa IDisposable (indiretamente através do Componente de extensão que o implementa), deve-se chamar Dispose e deixar isso para a limpeza apropriada. Eu não recomendaria chamar Process. Close em vez de, nem além de Process. Dispose. Sim, descartar chamadas Fechar. Minha primeira recomendação é usar um bloco de uso, meu segundo é chamar Close quando você souber quando terminar com ele. Em objetos que implementam um método quotClosequot apesar de serem IDisposable, é muito mais claro usar o método quotClosequot. Além disso, sem utilizar um bloco de uso, você não tem como definir o escopo da variável e a chamada para Dispose - o objeto poderia ser usado após a chamada para Dispose. Se você usar Close youve, descartará todos os seus recursos gerenciados, mas o objeto ainda poderá ser usado (isto é, ele não foi sinalizado como quotdisposedquot e você poderá usá-lo para executar outro aplicativo sem alocar um novo objeto Process - caso contrário lançaria um ObjectDisposedException ). Sexta-feira, 26 de outubro de 2007 18h09 Então, se a primeira recomendação é usar um bloco de uso, o melhor seria chamar Dispose. não Close, quando, como você disse, você sabe que está pronto com o objeto. Por apenas chamar Close em algo que implementa IDisposable, o desenvolvedor está potencialmente cometendo um erro. Se Dispose fizer alguma limpeza adicional além de apenas delegar para Close, o programador está se preparando para um bug apenas chamando Close. Pode haver um caso para chamar Close, mas somente se você não tiver terminado com o objeto, como você indicou na parte inferior de sua última resposta. Mas quando terminar, ligue para Dispose. Sexta-feira, 26 de outubro de 2007 18h20 Então, se a primeira recomendação é usar um bloco de uso, o melhor seria chamar Dispose. não Close, quando, como você disse, você sabe que está pronto com o objeto. Por apenas chamar Close em algo que implementa IDisposable, o desenvolvedor está potencialmente cometendo um erro. Se Dispose fizer alguma limpeza adicional além de apenas delegar para Close, o programador está se preparando para um bug apenas chamando Close. Pode haver um caso para chamar Close, mas somente se você não tiver terminado com o objeto, como você indicou na parte inferior de sua última resposta. Mas quando terminar, ligue para Dispose. Na verdade, é o equivalente a: DisposableClass obj new DisposableClass () ID descartável obj descartável como IDisposable if (null descartável) Mas sim, isso é o que uma instrução using é "funcionalmente equivalente", mas eu não concordo explicitamente chamar Dispose na presença de um método "Closequot" ser a primeira escolha por causa da falta de escopo com a chamada Dispose. Por exemplo, o seguinte: using (Process process new Process ()) Eu tive o serviço rodando, mas parei porque ele rodou por 2 horas e nunca tinha o breakpoint que deveria ter atingido dentro de 10 minutos de mim começando meu cliente. Eu descomentei a linha sIn. Close () agora mesmo e reiniciei o serviço e o Cliente e tudo está funcionando como antes. Eu posso acertar o ponto de interrupção após o WaitForExit () e eu concluir, com a mensagem de relatório de erros do Windows ainda (como era antes). Então, no meu caso, eu preciso fechar o fluxo de entrada para poder sair do processo como esperado. Existe alguma outra idéia que eu possa recomment a linha sIn. Close () se você quiser checar alguma coisa. Sexta-feira, 26 de outubro de 2007 19:19 Anthony Maimone escreveu: Eu tinha o serviço funcionando, mas eu parei porque ele tinha funcionado por 2 horas e nunca tinha o ponto de interrupção que deveria ter atingido dentro de 10 minutos de mim começando meu cliente . Eu descomentei a linha sIn. Close () agora mesmo e reiniciei o serviço e o Cliente e tudo está funcionando como antes. Eu posso acertar o ponto de interrupção após o WaitForExit () e eu concluir, com a mensagem de relatório de erros do Windows ainda (como era antes). Então, no meu caso, eu preciso fechar o fluxo de entrada para poder sair do processo como esperado. Existe alguma outra idéia que eu possa recomment a linha sIn. Close () se você quiser checar alguma coisa. Seria útil ver os detalhes da exceção quando você receber o erro (como a pilha de chamadas). Como você está usando a entrada padrão e a saída padrão Você está usando qualquer método ReadLine Peter, meu ponto é: se você não chamar Dispose em um objeto que implementa (direta ou indiretamente) IDisposable, então você está apenas pedindo um bug. Eu não quero discutir isso sem parar. Você pode continuar fazendo do jeito que você faz, e eu vou ficar com o meu. Contanto que não tenhamos que manter os códigos uns dos outros, tudo bem. E, a propósito, um bloco "quotingusing" também não protege você. Nada impede que você declare a variável fora do bloco (se bem me lembro), então ela ainda pode estar no escopo após o término do bloco. Você tem que ser diligente em escrever o código correto. Se você declará-lo na declaração "quotesusing", é uma maneira. Mas rejeitar usando a abordagem try / finally apenas porque deixa a variável no escopo não é realmente o ponto. Ainda precisa ser Dispose () d em algum lugar. Sexta-feira, 26 de outubro de 2007 19:34 Peter Ritchie escreveu: Anthony Maimone escreveu: Eu tinha o serviço funcionando, mas eu parei porque tinha corrido por 2 horas e nunca tinha o ponto de interrupção que deveria ter atingido dentro de 10 minutos de eu começando meu cliente. Eu descomentei a linha sIn. Close () agora mesmo e reiniciei o serviço e o Cliente e tudo está funcionando como antes. Eu posso acertar o ponto de interrupção após o WaitForExit () e eu concluir, com a mensagem de relatório de erros do Windows ainda (como era antes). Então, no meu caso, eu preciso fechar o fluxo de entrada para poder sair do processo como esperado. Existe alguma outra idéia que eu possa recomment a linha sIn. Close () se você quiser checar alguma coisa. Seria útil ver os detalhes da exceção quando você receber o erro (como a pilha de chamadas). Como você está usando a entrada padrão e a saída padrão Você está usando qualquer método ReadLine Novamente, esta não é uma exceção que está sendo lançada, portanto, não estou vendo detalhes de exceção. Eu não vou diretamente para o bloco catch no meu código, eu retomar DIRETAMENTE após a chamada WaitForExit (). A janela que estou recebendo é a mesma que você recebe quando QUALQUER produto da Microsoft fecha inesperadamente e o MS quer informações sobre o Crash. Então, novamente, não há detalhes de exceção. No entanto, em um dos registros do sistema, estou recebendo uma mensagem (traduzido do japonês) erros de aplicação quotDevenv. exe ocorrer, 8.0.50727.762 versão dos erros ocorreu módulo msvcr80.dll, versão 8.0.50727.762, erros ocorridos endereço 0x00039001. Para obter mais informações, visite o site www. microsoft. com/fwlink/events. asp e consulte o Helo e o Support Center. Estou redirecionando a entrada Padrão para passar os diferentes comandos porque estava com problemas para fazer com que funcionassem como eu queria formar o StartInfo . Estou redirecionando os fluxos de saída e erro para verificar o que eles contêm depois que o processo foi encerrado. Isso permitirá que eu verifique qualquer coisa que eu gostaria em qualquer fluxo, uma vez que tenhamos terminado. Também não permito que nenhum dos threads de redirecionamento de saída ou erro se junte até que o processo tenha passado pela chamada WaitForExit. Estou completamente perplexo. Sexta-feira, 26 de outubro de 2007 19:53 Peter, meu ponto é: se você não chamar Dispose em um objeto que implementa (direta ou indiretamente) IDisposable, então você está apenas pedindo um bug. Eu não quero discutir isso sem parar. Você pode continuar fazendo do jeito que você faz, e eu vou ficar com o meu. Contanto que não tenhamos que manter os códigos uns dos outros, tudo bem. Eu não concordo. Não é um quotbugquot para não chamar Dispose. Seus recursos não serão liberados imediatamente, mas o GC os liberará se precisar da memória (supondo que o padrão Dispose esteja adequadamente implementado e exista um finalizador). Se a classe que você está usando implementa um método quotClosequot que não faz as mesmas coisas que quotDisposequot, Close deve ser documentado como tal ou há um bug na classe. Eu nunca encontrei uma classe de framework que implementa IDisposable e um método Close () que introduziu um quotleakquot quando Close foi chamado sem chamar Dispose. O padrão esmagador para Dispose / Close é que Dispose chama Close, além de definir um sinalizador quotdisposedquot (usado para lançar ObjectDisposedException). Na verdade, isso é detalhado na Referência Geral do. NET Framework: quot Ocasionalmente, um nome específico de domínio é mais apropriado que Dispose. Por exemplo, um encapsulamento de arquivo pode querer usar o nome do método Close. Nesse caso, implemente Dispose de forma particular e crie um método Close público que chame Dispose. O exemplo de código a seguir ilustra esse padrão. Você pode substituir Fechar por um nome de método apropriado para seu domínio. de Implementando Finalizar e Descartar para Limpar Recursos Não Gerenciados Assim como para certas classes de objetos, como arquivos ou objetos de conexão de banco de dados, um método Close representa melhor a operação lógica que deve ser executado quando o consumidor de objetos é finalizado com o objeto. de Melhorando o Desempenho de Código Gerenciado (embora também detalhe os detalhes. Em casos bem escritos, ambos são funcionalmente equivalentes. Isso implica que usar Close é mais claro com quotbetter representa). E, a propósito, um bloco "quotingusing" também não protege você. Nada impede que você declare a variável fora do bloco (se bem me lembro), então ela ainda pode estar no escopo após o término do bloco. Você tem que ser diligente em escrever o código correto. Se você declará-lo na declaração "quotesusing", é uma maneira. Mas rejeitar usando a abordagem try / finally apenas porque deixa a variável no escopo não é realmente o ponto. Ainda precisa ser Dispose () d em algum lugar. Sim, há todos os tipos de maneiras que você pode atirar no próprio pé, mas isso não é um cenário que estávamos discutindo. Eu pessoalmente derrubaria qualquer código que eu revisasse assim. Isso estaria na minha lista não recomendada. Sexta-feira, 26 de outubro de 2007 19:54 Novamente, isso não é uma exceção que está sendo lançada, por isso não estou vendo detalhes de exceção. Eu não vou diretamente para o bloco catch no meu código, volto DIRETAMENTE após a chamada WaitForExit (). A janela que estou recebendo é a mesma que você recebe quando QUALQUER produto da Microsoft fecha inesperadamente e o MS quer informações sobre o Crash. Então, novamente, não há detalhes de exceção. No entanto, em um dos registros do sistema, estou recebendo uma mensagem (traduzido do japonês) erros de aplicação quotDevenv. exe ocorrer, 8.0.50727.762 versão dos erros ocorreu módulo msvcr80.dll, versão 8.0.50727.762, erros ocorridos endereço 0x00039001. Para obter mais informações, visite o site www. microsoft. com/fwlink/events. asp e consulte o Helo and Support Center. Eu supus que seu aplicativo estava gerando a mensagem (nesse caso, você deve sempre obter uma exceção e um rastreamento de pilha). retomar após a chamada para WaitForExit (). Parece-me que a aplicação que você está executando está terminando de forma anormal. Você está executando devenv. exe Não tenho certeza o que você pode fazer no seu aplicativo para impedir que outro aplicativo seja encerrado de forma anormal. Anthony Maimone escreveu: Estou redirecionando a entrada Padrão para passar os diferentes comandos porque estava tendo problemas para fazer com que funcionassem como eu queria formar o StartInfo. Estou redirecionando os fluxos de saída e erro para verificar o que eles contêm depois que o processo foi encerrado. Isso permitirá que eu verifique qualquer coisa que eu gostaria em qualquer fluxo, uma vez que tenhamos terminado. Também não permito que nenhum dos threads de redirecionamento de saída ou erro se junte até que o processo tenha passado pela chamada WaitForExit. Estou completamente perplexo. Você pode obter um deadlock se bloquear na leitura e na saída padrão dos aplicativos - o que desbloquearia se você fechasse o fluxo, acredito. A única coisa em que posso pensar é criar um aplicativo que está sendo executado no servidor e monitorar as janelas que estão sendo formadas pelos processos que você está controlando remotamente e, em seguida, encontrar os botões corretos e pressioná-los programaticamente colocando uma mensagem na bomba de mensagem da janela de diálogo . Isso acontece com o Excel, Word e outros aplicativos que podem ser usados ​​com a autimação. O MSFT não projetou esses aplicativos para serem executados sem a interação do usuário, portanto, de vez em quando, você obterá erros no Windows. Você já considerou o uso do MSBuid que é mais apropriado para compilações em lote, também parece que no TFS 2008 será fácil construir servidores de compilação. Sábado, 27 de outubro de 2007 11:07 Bem, tentei usar FindWindow e FindWindowEx junto com SendMessage, mas não consegui encontrar o identificador de janela correto. Mas, como sei que uma Caixa de Mensagens do Relatório de Erros do Windows será exibida, verifiquei se era seu próprio processo (e é). O processo é dwwin. exe (Dr. Watson Win) e tudo o que eu tinha que fazer era permitir que eu corrigisse o problema atual. Substitua o bloco de código atual abaixo pela instrução WaitForExit () que eu tinha anteriormente. proc. WaitForExit (60000) // um minuto Process ProcArray Process. GetProcessesByName (quotdwwinquot) foreach (Process ProcessFound no ProcArray) Também verifiquei se você conseguiu obter o Process. MainWindowTitle (), mas ele está definido como quotquot. Então isso é um hack e eu realmente não gosto de usá-lo, mas funciona para a execução atual. Segunda-feira, 29 de outubro de 2007 19:26

Комментариев нет:

Отправить комментарий