Process waitforexit em c #


Process. waitforexit in c #
Eu quero esperar por um processo para concluir, mas process. WaitForExit () trava minha GUI. Existe uma maneira baseada em eventos, ou eu preciso gerar um thread para bloquear até sair e delegar o evento eu mesmo?
A partir do 4.0 / C # 5, é melhor representá-lo usando o padrão assíncrono.
Se você escolher a resposta @MgSam, esteja ciente, se você passar por WaitForExitAsync algum CancellationToken, que será automaticamente cancelado após o atraso especificado, você poderá obter uma InvalidOperationException. Para corrigir isso, você precisa mudar.

Processo . Método WaitForExit (Int32)
A documentação de referência da API tem uma nova casa. Visite o Navegador da API em docs. microsoft para ver a nova experiência.
Instrui o componente Processo a aguardar o número especificado de milissegundos para o processo associado sair.
Assembly: System (no System. dll)
Parâmetros
O período de tempo, em milissegundos, para aguardar a saída do processo associado. O máximo é o maior valor possível de um inteiro de 32 bits, que representa infinito para o sistema operacional.
Valor de retorno.
true se o processo associado tiver saído; Caso contrário, false.
A configuração de espera não pôde ser acessada.
Nenhuma identificação de processo foi definida e uma Handle da qual a propriedade Id pode ser determinada não existe.
Não há processo associado a este objeto Process.
Você está tentando chamar WaitForExit (Int32) para um processo que está sendo executado em um computador remoto. Este método está disponível apenas para processos em execução no computador local.
WaitForExit (Int32) faz com que o segmento atual espere até que o processo associado termine. Deve ser chamado depois que todos os outros métodos forem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exited.
Este método instrui o componente Process a aguardar uma quantidade finita de tempo para o processo sair. Se o processo associado não sair no final do intervalo porque a solicitação para finalizar é negada, false é retornado para o procedimento de chamada. Você pode especificar um número negativo (Infinito) por milissegundos e Processo. WaitForExit (Int32) se comportará da mesma maneira que a sobrecarga WaitForExit (). Se você passar 0 (zero) para o método, ele retornará true somente se o processo já tiver saído; caso contrário, retorna imediatamente false.
No Framework 3.5 e em versões anteriores, se milissegundos fosse -1, a sobrecarga WaitForExit (Int32) aguardava milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente.
Quando a saída padrão foi redirecionada para manipuladores de eventos assíncronos, é possível que o processamento de saída não seja concluído quando esse método retornar. Para garantir que o tratamento assíncrono de eventos tenha sido concluído, chame a sobrecarga WaitForExit () que não recebe nenhum parâmetro após receber um valor verdadeiro dessa sobrecarga. Para ajudar a garantir que o evento Exited seja tratado corretamente nos aplicativos do Windows Forms, defina a propriedade SynchronizingObject.
Quando um processo associado sai (é desligado pelo sistema operacional por meio de uma finalização normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (Int32). O componente de processo pode acessar as informações, que inclui o ExitTime, usando o identificador para o processo de saída.
Como o processo associado foi encerrado, a propriedade Handle do componente não aponta mais para um recurso de processo existente. Em vez disso, o identificador pode ser usado apenas para acessar as informações do sistema operacional sobre o recurso do processo. O sistema está ciente de identificadores para processos que não foram liberados pelos componentes do processo, portanto, ele mantém as informações de ExitTime e identificador na memória até que o componente de processo especificamente libera os recursos. Por esse motivo, sempre que você chamar a instância Start for Process, chame Close quando o processo associado tiver terminado e você não precisar mais de nenhuma informação administrativa sobre ele. Close libera a memória alocada para o processo finalizado.

Process. waitforexit in c #
Você está executando console & quot; cmd & quot; ?
Se sim, então você tem que digitar exit também.
// Processo finalizado antes do período de tempo limite.
// Imprime mensagem de erro?
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 me sacar. 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 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.
Sem conhecer os detalhes da mensagem, estamos apenas adivinhando o problema.
Você já instalou o 3.5 beta ou o Visual Studio 2008 beta?
Como você está usando o processo para iniciar o programa, Process. Start (& quot; file. exe & quot;), ou você está usando ProcessStartInfo?
Não, eu tenho 2003 e 2005 instalado.
proc = new Process ();
procSI = new ProcessStartInfo ();
Eu então configurei um novo thread para o StandardError e o StandardOutput.
Eu então escrevo meus comandos e.
if (redirecionando para fora do padrão)
Iniciar discussão para st. Fora.
Se (redirecionando erro padrão)
Iniciar discussão para st. erro.
Proc. WaitForExit (); & lt; -------- é onde ocorre a janela Relatório de erros do Windows genérico.
Traduzi o que pude da janela que aparece.
Veja também: Microsoft Visual Studio 2005, clique aqui para exibir o artigo traduzido
Porque o problema ocorre, ele termina o Microsoft Visual Studio 2005. Aplicamos a inconveniência, não há desculpa.
Obrigado novamente por todo o seu tempo.
Por que você está fazendo isso? Você não possui esse fluxo, então você não deveria estar fechando.
Isso é um erro de digitação? Antes de você estar falando sobre uma variável chamada "proc", não "Proc". Então, isso é simplesmente uma referência nula porque você está tentando invocar um método em uma referência diferente de & quot; proc & quot ;?
Você não deseja fechar o objeto sIn até que o aplicativo seja encerrado se você estiver redirecionando. Se o aplicativo gravar na saída padrão ou ler na entrada padrão depois de você fechar um deles, isso poderá causar uma exceção.
Você tem o rastreamento de pilha dessa mensagem de erro?
Você não deseja 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.
Eu criei o StreamWriter sIn antes de criar o objeto Process do processo. Eu então redireciono a entrada após o comando proc. Start (), então como eu não possuo isso? Independentemente disso, eu posso fazer a mudança para mover o sIn. Close () para depois da chamada WaitForExit para ver se isso faz alguma 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 ().
Você não deseja 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.
Ok, eu estou fazendo Process. Close no bloco finally do meu código, por isso deve ser cuidado então.
Perdoem o meu comentário "não possuírem" o que fiz anteriormente. Acabei de voltar do almoço e estava perdendo o fato de que o processo tem controle sobre isso.
Process. Close é o método recomendado para fechar os fluxos padrão de entrada e saída padrão (e padrão).
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.
Process. Close é o método recomendado para fechar os fluxos padrão de entrada e saída padrão (e padrão).
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.
Como eu tenho certeza que você sabe, estes são funcionalmente equivalentes:
using (SomethingDisposable myObject =.)
// use myObject aqui.
// use myObject aqui.
if (myObject! = null) myObject. Dispose ();
Portanto, 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 da sua última resposta. Mas quando terminar, ligue para Dispose.
Como eu tenho certeza que você sabe, estes são funcionalmente equivalentes:
using (SomethingDisposable myObject =.)
// use myObject aqui.
// use myObject aqui.
if (myObject! = null) myObject. Dispose ();
Portanto, 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 da sua última resposta. Mas quando terminar, ligue para Dispose.
DisposableClass obj = new DisposableClass ();
ID descartável descartável = obj como IDisposable;
if (descartável! = nulo)
Mas sim, é isso que uma declaração de uso é "funcionalmente equivalente" para; mas eu não concordo explicitamente chamando Dispose na presença de um & quot; Close & quot; O método deve ser a primeira escolha devido à falta de escopo com a chamada Dispose. Por exemplo, o seguinte:
using (Process process = new Process ())
. é um erro de sintaxe.
Enquanto o seguinte:
Process process = new Process ();
// não há como garantir "processar & quot; não vai.
// ser acessado após o acima.
É um erro de tempo de execução (ObjectDisposedException). Usando Close não causa o erro de tempo de execução:
Process process = new Process ();
É sempre melhor trocar um erro em tempo de compilação por um erro em tempo de execução.
Então, eu configurei um ponto de interrupção após a chamada proc. WaitForExit () e ainda não atingi este ponto de interrupção. Então parece que isso é um grande problema.
Então, eu configurei um ponto de interrupção após a chamada proc. WaitForExit () e ainda não atingi este ponto de interrupção. Então parece que isso é um grande problema.
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. Existem outras ideias?
Eu posso recomment a linha sIn. Close () se você quiser checar alguma coisa.
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. Existem outras ideias?
Eu posso recomment a linha sIn. Close () se você quiser checar alguma coisa.
Como você está usando a entrada padrão e a saída padrão? Você está usando algum 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 do jeito que você faz, e eu vou ficar com o meu. Contanto que não tenhamos que manter o código um do outro, tudo bem.
E, a propósito, um & quot; usando & quot; bloco não protege você também. 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ê declarar no campo & quot; using & quot; declaração, isso é um caminho. Mas rejeitar usando a abordagem try / finally apenas porque deixa a variável no escopo não é realmente o ponto. Ainda precisa ser Dispose () em algum lugar.
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. Existem outras ideias?
Eu posso recomment a linha sIn. Close () se você quiser checar alguma coisa.
Como você está usando a entrada padrão e a saída padrão? Você está usando algum método ReadLine?
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 Logs do sistema, estou recebendo uma mensagem (traduzida do japonês)
& quot; Devenv. exe aplicação erros ocorrem, versão 8.0.50727.762 dos erros ocorridos módulo msvcr80.dll, versão 8.0.50727.762, erros ocorridos endereço 0x00039001.
Para mais informações, visite o site www. microsoft. com/fwlink/events. asp e consulte o Helo and Support Center. & Quot;
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.
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 do jeito que você faz, e eu vou ficar com o meu. Contanto que não tenhamos que manter o código um do outro, tudo bem.
Eu não concordo. Não é um "bug" 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 turma que você está usando implementa um & quot; Fechar & quot; método que não faz as mesmas coisas que "Dispose", 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 & quot; leak & quot; quando Close foi chamado sem chamar Dispose. O padrão esmagador para Dispose / Close é que Dispose calls Close, bem como a configuração de um & quot; disposed & quot; flag (usado para jogar ObjectDisposedException).
Na verdade, isso é detalhado na Referência Geral do Framework: "Ocasionalmente, um nome específico do 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 ao seu domínio. & Quot; de Implementar Finalizar e Descartar para Limpar Recursos Não Gerenciados.
Assim como & quot; Para certas classes de objetos, como arquivos ou objetos de conexão com o banco de dados, um método Close representa melhor a operação lógica que deve ser executada quando o consumidor do objeto tiver terminado o objeto. & Quot; de Melhorando o Desempenho do Código Gerenciado (embora também detalhe "Em casos bem escritos, ambos são funcionalmente equivalentes". Isso implica que o uso de Close é mais claro com "representa melhor").
E, a propósito, um & quot; usando & quot; bloco não protege você também. 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ê declarar no campo & quot; using & quot; declaração, isso é um caminho. Mas rejeitar usando a abordagem try / finally apenas porque deixa a variável no escopo não é realmente o ponto. Ainda precisa ser Dispose () em algum lugar.

Process. waitforexit in c #
Você poderia usar um bloco de uso por esse motivo.
O mesmo com "EnableRaisingEvents", necessário apenas se você quiser manipular o evento "Exited".
Eu estou desenvolvendo um editor de desenho em C # e OpenGL como Autocad, estou usando o Viewport com uma tela, o editor pode importar os arquivos DXF e desenhar na tela. Agora eu tenho que incluir o recurso de edição que é "Mover Desenho" e "Copiar Desenho".
Neste método, como experimento, tentei definir todos os privilégios para ver se, talvez, eu estivesse perdendo um, mas geralmente eu configuraria o TCB (se esse for o correto para definir).
Confira meu blog em tjoe. wordpress.
do lado esquerdo, verifique se está entre parênteses (agora é) e lance-o como.
As dicas deste mês:
- antes de fazer uma pergunta aqui, pesquise CodeProject, depois o Google;
- a qualidade e os detalhes da sua pergunta refletem na eficácia da ajuda que você provavelmente obterá;
- use as tags PRE para preservar a formatação ao exibir snippets de código de várias linhas.
Mesmo no modo de depuração, ele mostra WordProcess. HasExited == true logo após o início do processo.
Além disso, a janela não abre maximizada.
Por favor ajude! Obrigado!
Eu tenho uma classe expondo um método público que limpa um objeto de fila. Em um formulário usando este objeto, ao chamar este método, está causando uma exceção: Método não encontrado.
Quais possíveis soluções existem?
A mensagem de exceção deve informar o nome do método ausente.
- não há nenhum método com esse nome.
- não há método que aceite parâmetros desse tipo.
- não há método com esse tempo de retorno.
ou o aplicativo carrega os assemblies clr errados (1.1 em vez de 2.0)
"Eu acho que é o que separa os profissionais do arrastar e soltar, feminino wirly, namby pamby, wishy washy, não pode codificar para os tipos de porcaria." - Pete O'Hanlon.
Felicidade em pessoas inteligentes é a coisa mais rara que eu conheço. Ernest Hemingway.
Deja View - a sensação de que você já viu este post antes.
a classe em um projeto e o chamador está em outro projeto ... tanto c #
. durante a execução / depuração, a exceção "Método não encontrado" é levantada!
alguma ideia ou guia de como? estou cansado.
2. Não selecione nenhum item na Faixa do Menu de Contexto.
3. Selecione qualquer TreeNode na Treeview. Agora o menu de contexto desaparece. (Isto é bom)
4. Agora pressione qualquer tecla do teclado. Nada está funcionando. O controle ainda está.
com o menu popup ContextMenuStrip, embora tenha desaparecido.
Como resolver este problema ?. Como desativar o evento Keydown em ContextMemuStrip?
Eu adicionei o contextMenuStrip no formulário em tempo de design. Eu exibi itens nele e usando o evento de clique do mouse para funcionalidade. Mas quando eu pressiono o evento Key down no menu de contexto e quando eu voltar para Treeview e pressione a tecla para baixo o controle está indo para Contextmenu. É suposto ir para Treeview.

C # Process. WaitForExit () 与 死锁.
Tabelas de eco no nível 0:
Se existir, InstallScripts \ Create01.sql (
sqlplus% 1 /% 2 @% 3 @InstallScripts \ Create01.sql | % HideSQLPlusRows%
Se existir, InstallScripts \ Create02.sql (
而 了 两天 , , , 发现 原因 是 是 了 死锁 死锁 由于 标准 标准 输出 被 被 , 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 4) , , 而 而 而 而 而 而 而 而 而 而 的 的 的 的 的 的 的 的 的 的 的 的 上面 上面 上面 的 时候Clique aqui para ver o artigo cmd. exe Clique aqui para fazer o download do aplicativo, clique em C # App e clique no botão direito do mouse em WaitForExit () e clique no botão direito do mouse. , 最后 形成 死锁。
Tabelas de eco no nível 0:
Se existir, InstallScripts \ Create01.sql (
sqlplus% 1 /% 2 @% 3 @InstallScripts \ Create01.sql | % HideSQLPlusRows% & gt; Registros \ Create_% 1.txt.

C # Process. WaitForExit () 与 死锁.
Tabelas de eco no nível 0:
Se existir, InstallScripts \ Create01.sql (
sqlplus% 1 /% 2 @% 3 @InstallScripts \ Create01.sql | % HideSQLPlusRows%
Se existir, InstallScripts \ Create02.sql (
而 了 两天 , , , 发现 原因 是 是 了 死锁 死锁 由于 标准 标准 输出 被 被 , 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 而 4) , , 而 而 而 而 而 而 而 而 而 而 的 的 的 的 的 的 的 的 的 的 的 的 上面 上面 上面 的 时候Clique aqui para ver o artigo cmd. exe Clique aqui para fazer o download do aplicativo, clique em C # App e clique no botão direito do mouse em WaitForExit () e clique no botão direito do mouse. , 最后 形成 死锁。
Tabelas de eco no nível 0:
Se existir, InstallScripts \ Create01.sql (
sqlplus% 1 /% 2 @% 3 @InstallScripts \ Create01.sql | % HideSQLPlusRows% & gt; Registros \ Create_% 1.txt.

Comments