среда, 16 мая 2018 г.

C # processo waitforexit close


C # processo waitforexit fechar
Obter através da App Store Leia esta publicação em nosso aplicativo!
WaitforExit doesn & # 39; t funcionar corretamente.
Então, estou lutando por esse problema por algum tempo agora e tentei muitas maneiras diferentes de corrigi-lo, mas não posso.
Basicamente, o meu aplicativo faz é chamar um arquivo java para carregar um aplicativo em um dispositivo. Enquanto está carregando, ele está imprimindo para uma caixa de richtext, então eu gostaria de passar para o próximo arquivo. O problema que estou tendo é que, enquanto o primeiro arquivo está sendo carregado, o 2º tenta carregar quais problemas de casos. Eu tentei a espera para a saída, mas se eu fizer isso, então os dados de saída não são escritos na caixa de texto rica. Alguma ideia?
Eu tentei colocar a espera para sair em muitos lugares diferentes, mas isso não parece funcionar.
Dois métodos abaixo escrevem o stdout ou erro no campo richtext.
Qualquer ideia seria excelente. Basicamente eu preciso do processo para sair, então eu posso continuar a pensar que o forloop carrega o próximo arquivo.
Se você WaitForExit, seu aplicativo bloqueia (espera) até o processo sair. Isso significa que não é possível processar qualquer mensagem do Windows em seu segmento UI, portanto, não atualiza a UI.
Você precisa iniciar o processo "em segundo plano" para que sua UI continue atualizando. Isso pode ser feito com:
Inicie e monitore o processo de um segmento separado e passe as informações de progresso de volta para o segmento UI para exibição. Adicione um manipulador de eventos ao evento encerrado pelo processo ou examine periodicamente o sinalizador process. HasExited e use isso para saber quando o primeiro processo acabado. Seu manipulador de eventos iniciaria esse processo e, em seguida, sairá de volta para o loop de aplicativo principal, de modo que ele seja executado normalmente enquanto espera que o processo externo seja concluído.
Sente-se em um loop de espera ocupado até que ele seja concluído e processe os eventos do aplicativo. (Tenha cuidado com isso, pois quaisquer eventos que causem chamadas reentrantes para este código poderiam fazer coisas muito ruins. Geralmente, se você usar essa abordagem, você deve ter certeza de que o resto do seu aplicativo está "bloqueado" em um estado onde o conhece está ocupado aguardando a conclusão de um processo). Isso é efetivamente o que WaitForExit faz, mas também processa eventos de aplicativos, permitindo que a IU permaneça vagamente responsiva:
Talvez eu esteja totalmente errado aqui, mas.
Você precisa ter um espaço após o - jar.
Ou então, Java vai bombardear imediatamente.
Tentando mover a chamada WaitForExit para fora do segmento UI.
Como M. Babcock mencionou, você está mantendo as atualizações na caixa de texto rica.
Uma solução semelhante a esta pode funcionar:
Modifique btnLoad_Click para iniciar um novo tópico que processa a lista (isto vai na contagem> ramo 0)

C # processo waitforexit fechar
Obter através da App Store Leia esta publicação em nosso aplicativo!
É necessário usar Process. WaitForExit após Process. Kill?
É necessário usar Process. WaitForExit após Process. Kill?
E se o processo de chamada sair logo depois, ele chama Process. Kill?
Isso causaria Process. Kill para falhar?
Editar: Preciso matar um processo ao sair do meu aplicativo. Neste ponto, não pretendo lidar com as situações em que a matança falha, por isso não é necessário aguardar o encerramento do processo. Então, se chamar WaitForExit não for necessário, basta ignorá-lo.
De acordo com a documentação sobre MSDN (ênfase na minha)
Observação O método Kill é executado de forma assíncrona. Depois de chamar o método Kill, chame o método WaitForExit para aguardar o encerramento do processo ou verifique a propriedade HasExited para determinar se o processo foi encerrado.
Se você não precisa esperar, se você não precisa determinar se o processo realmente existe, então eu suponho que não precisa chamar WaitForExit ou verificar HasExited.

C # processo waitforexit fechar
A sobrecarga WaitForExit () () () é usada para fazer o thread atual aguardar até o processo associado terminar. Esse 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 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 é, naturalmente, para. O que faz você pensar que não aguarda que o processo de nota termine? Quais são os sinais disso? Qual é a prova?
Processo p = novo Processo ();
MessageBox. Show (& quot; agora o navegador deve estar fechado & quot;);
Exceto que você não obtém um objeto de processo que você pode usar. Se você tentar.
Dim myProc como novo processo ()
myProc = Process. Start (& quot; iexplore & quot ;, & quot; finance. yahoo/q/hp? s = & quot; + symbol);
A Microsoft está conduzindo 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.

C # processo waitforexit fechar
Obter através da App Store Leia esta publicação em nosso aplicativo!
Process. kill () termina o WaitForExit () (sem limite de tempo)
Eu tenho um processo que é executado em segundo plano e tem WaitForExit (), uma vez que a duração pode variar e preciso aguardar até que ele termine. Em ocasiões, eu 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 eu realmente 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 "mover-se". 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.
WaitForExit é uma chamada direta para o sistema operacional para aguardar a sinalização do processar. 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á o problema 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 reprografia de 5 linhas? Eu 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.

Processo . Método WaitForExit ()
A documentação de referência da API tem uma nova casa. Visite o navegador da API no docs. microsoft para ver a nova experiência.
Instrui o componente Processo a esperar indefinidamente para que o processo associado saia.
Assembly: System (no System. dll)
A configuração de espera não pôde ser acessada.
Nenhum Id do processo foi configurado e um identificador do qual a propriedade Id pode ser determinada não existe.
Não existe nenhum processo associado a este objeto Processo.
Você está tentando chamar WaitForExit () para um processo que está sendo executado em um computador remoto. Este método está disponível somente para processos que estão sendo executados no computador local.
WaitForExit () faz o thread atual aguardar até o processo associado terminar. Ele deve ser chamado após todos os outros métodos serem chamados no processo. Para evitar o bloqueio do segmento atual, use o evento Exitado.
Esse método instrui o componente Processo a aguardar uma quantidade infinita de tempo para que o processo e os manipuladores de eventos saem. 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.
No Quadro 3.5 e versões anteriores, a sobrecarga WaitForExit () esperava milissegundos MaxValue (aproximadamente 24 dias), não indefinidamente. Além disso, as versões anteriores não esperaram que os manipuladores de eventos saíssem se o tempo MaxValue completo fosse atingido.
Esta sobrecarga garante que todo o processamento foi 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 foi redirecionada para manipuladores de eventos assíncronos.
Quando um processo associado sai (ou seja, quando é encerrado pelo sistema de operação através de um término normal ou anormal), o sistema armazena informações administrativas sobre o processo e retorna ao componente que chamou WaitForExit (). O componente Processo pode acessar a informação, que inclui o ExitTime, usando o Handle para o processo encerrado.
Como o processo associado saiu, a propriedade Handle do componente já não aponta 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 manipulações para processos que não foram lançados pelos componentes do Processo, portanto, mantém as informações ExitTime e Handle na memória até que o componente Processo liberte especificamente os recursos. Por esse motivo, sempre que você ligar para uma instância do Start for Process, chame Close quando o processo associado for encerrado e você não precisa mais de informações administrativas sobre isso. Fechar libera a memória alocada para o processo encerrado.
Consulte a seção Comentários da página de referência da propriedade StandardError.
para uma confiança total para o chamador imediato. Este membro não pode ser usado por código parcialmente confiável.

C # processo waitforexit fechar
Esta pergunta pode parecer um pouco estranha, mas estou tentando executar VS2005 através de um processo e executar um comando específico e eu waitforexit (). Estou redirecionando minha entrada e saída com sucesso, mas de vez em quando eu recebo uma Window Window / Message Window Window. O problema é que eu estou remoting, então quando esta mensagem / janela ocorre durante a execução do processo, eu vou pendurar a menos que eu logar na outra máquina (remota) e fechar a janela.
Existe alguma maneira de matar programaticamente esta janela ou possivelmente desativar a mensagem / janela? Eu pensei em executar o VS em uma execução silenciosa (ainda tenho que encontrar uma maneira de fazê-lo). Eu também tentei ver se há algo que está sendo lançado quando isso ocorre comparado ao quando não.
Bem, eu tentei usar FindWindow e FindWindowEx junto com SendMessage, mas não consegui encontrar o identificador de janela correto. Mas, como eu sei que uma caixa de Msssage de relatórios de erros do Windows aparecerá, verifiquei se era seu próprio processo (e é). O processo é dwwin. exe (Dr. Watson Win) e tudo o que eu tinha que fazer era isso para me permitir corrigir o problema atual. Substitua o atual bloco de código abaixo para a declaração WaitForExit () que eu tinha anteriormente.
Proc. WaitForExit (60000); // um minuto.
Processo [] ProcArray = Process. GetProcessesByName (& quot; dildin & quot;);
foreach (Process ProcessFound em ProcArray)
Eu também verifiquei se você conseguiu obter o Process. MainWindowTitle (), mas está definido como & quot; & quot ;. Então, isso é um hack e eu realmente não gosto de usá-lo, mas funciona para a execução atual.
Todas as respostas.
Você pode ser específico com o erro que está recebendo?
Isso ocorre apenas quando você está redirecionando a entrada e a saída?
Você está executando console? Cmd & quot; ?
Se sim, você deve digitar exit também.
// Processo interrompido antes do período de tempo limite.
// Imprimir mensagem de erro?
Gostaria de tentar isso, mas é muito um hack. Eu tenho muitos comandos diferentes que levam diferentes períodos de tempo (30 segundos a 25 minutos), então não há configurações de tempo real que eu poderia colocar sem destruir o meu desempenho. Esta função tem funcionado corretamente para vários comandos nos últimos 6 meses e agora ele decide sair para mim. Eu tentei em um computador diferente sem problemas (o que realmente está me mexendo). Eu sei que não é o redirecionamento de saída / erro porque uma nova WINDOW está sendo criada no servidor ao qual eu estou remoting. Assim que eu fechar essa janela, meu processo sai como esperado e a saída correta é exibida no lado do Usuário.
Obrigado pela sua ajuda, mas estou realmente frustrado com este problema.
Sem saber o detalhe da mensagem, estamos apenas adivinhando o problema.
Você instalou o beta 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 instalados.
proc = new Process ();
procSI = novo ProcessStartInfo ();
Em seguida, configurei um novo tópico para o StandardError e StandardOutput.
Depois escrevo meus comandos e.
se (redirecionando o padrão para fora)
Inicie o tópico para o st. Fora.
Se (redirecionando o erro padrão)
Inicie o tópico para o st. erro.
Proc. WaitForExit (); & lt; -------- é onde ocorre a janela Generic Windows Reporting de Erros.
Eu traduzi o que pude da Janela que aparece.
問題 が 発 生 し た た め, Microsoft Visual Studio 2005 を 終了 し ま す. ご 不便 を お か け し て 申 し 訳 あ り ま せ ん.
Porque o problema ocorre, ele termina o Microsoft Visual Studio 2005. Aplicando inconvenientes, 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 deve fechá-lo.
Isso é um erro de digitação? Antes de você falar 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 "proc"?
Você não deseja fechar o objeto sIn até que o aplicativo tenha saído se você estiver redirecionando. Se o aplicativo grava a saída padrão ou lê da entrada padrão depois de fechar qualquer um desses, isso pode causar uma exceção.
Você tem o rastreamento da pilha dessa mensagem de erro?
Você não deseja fechar o objeto sIn até que o aplicativo tenha saído se você estiver redirecionando.
Não se deve fechar nenhum desses fluxos. O objeto Processo os possui e é o responsável pela limpeza depois de si próprio. Deveria, na melhor das hipóteses, chamar Process. Dispose () depois de terminar o objeto Processo.
Eu criei o SQL Server do StreamWriter antes de criar o objeto Proc Process. Eu então redireciono a entrada após o comando proc. Start (), então, como eu não possuo isso? Independentemente disso, posso fazer a mudança para mover o sIn. Close () para depois da chamada WaitForExit para ver se isso faz alterações.
O Proc era um tipo, deveria ter sido proc.
Novamente, não é uma mensagem de erro, portanto, não há rastreamento de pilha. O redirecionamento do meu StandardError está vazio eo redirecionamento de saída padrão contém o que eu esperava, mas nada indicando que ocorreu um erro. É por isso que tudo ainda funciona depois que eu fechar a janela de Relatório de Erros do Windows.
Posso publicar 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 tenha saído se você estiver redirecionando.
Não se deve fechar nenhum desses fluxos. O objeto Processo os possui e é o responsável pela limpeza depois de si próprio. Deveria, na melhor das hipóteses, chamar Process. Dispose () depois de terminar o objeto Processo.
Ok, estou fazendo Process. Fechar no último bloco do meu código, então deve ser cuidada então.
Perceba o meu comentário "não próprio" que eu fiz anteriormente. Acabei de voltar de almoço e faltava o fato de que o processo tem controle disso.
Process. Close é o método recomendado para fechar os fluxos de entrada padrão e padrão (e padrão).
Eu ficaria surpreso se o método Dispose não chamasse de Fechar, pelo menos como parte de sua operação. Eu preferiria usar o fato de que, desde que o Processo implementa IDisposable (indiretamente através do componente de extensão que o implementa), um deve invocar Dispose e permitir que a limpeza adequada. Eu não recomendaria invocar Process. Close em vez de, nem além de, Process. Dispose.
Process. Close é o método recomendado para fechar os fluxos de entrada padrão e padrão (e padrão).
Eu ficaria surpreso se o método Dispose não chamasse de Fechar, pelo menos como parte de sua operação. Eu preferiria usar o fato de que, desde que o Processo implementa IDisposable (indiretamente através do componente de extensão que o implementa), um deve invocar Dispose e permitir que a limpeza adequada. Eu não recomendaria invocar Process. Close em vez de, nem além de, Process. Dispose.
Como tenho certeza que você sabe, estes são funcionalmente equivalentes:
usando (SomethingDisposable myObject =.)
// use myObject aqui.
// use myObject aqui.
se (myObject! = null) myObject. Dispose ();
Então, se a primeira recomendação for usar um bloco de uso, então o próximo melhor seria chamar Dispose, não Fechar, quando, como você disse, você sabe que você terminou com o objeto.
Ao ligar apenas perto de algo que implementa IDisposable, o desenvolvedor está cometer um erro. Se Dispose fizer alguma limpeza adicional além de apenas delegar para Fechar, então o programador está configurando-se para um bug, apenas ligando para Fechar.
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 com isso, chame Dispose.
Como tenho certeza que você sabe, estes são funcionalmente equivalentes:
usando (SomethingDisposable myObject =.)
// use myObject aqui.
// use myObject aqui.
se (myObject! = null) myObject. Dispose ();
Então, se a primeira recomendação for usar um bloco de uso, então o próximo melhor seria chamar Dispose, não Fechar, quando, como você disse, você sabe que você terminou com o objeto.
Ao ligar apenas perto de algo que implementa IDisposable, o desenvolvedor está cometer um erro. Se Dispose fizer alguma limpeza adicional além de apenas delegar para Fechar, então o programador está configurando-se para um bug, apenas ligando para Fechar.
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 com isso, chame Dispose.
DisposableClass obj = new DisposableClass ();
IDisposable descartable = obj como IDisposable;
se (descartável! = nulo)
Mas sim, é isso que uma declaração de uso é "equivalente funcionalmente" para; mas eu não concordo chamando explicitamente 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:
usando (processo processo = novo processo ()
. é um erro de sintaxe.
Enquanto o seguinte:
Processo process = new Process ();
// não há como garantir o "processo" não vai.
// seja acessado após o acima.
É um erro em tempo de execução (ObjectDisposedException). Usar fechar não causa o erro de tempo de execução:
Processo process = new Process ();
É sempre melhor trocar um erro de tempo de compilação por um erro de tempo de execução.
Então, estabeleci 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 é um problema.
Então, estabeleci 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 é um problema.
Eu tinha o serviço funcionando, mas eu parei porque tinha funcionado por 2 horas e nunca tinha o ponto de parada que deveria ter atingido dentro de 10 minutos de mim, começando meu cliente. Eu não comentei a linha sIn. Close () agora e voltei a iniciar o serviço e o Cliente e tudo está funcionando como antes. 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, PRECISO fechar o fluxo de entrada para poder sair do processo conforme o esperado. Existem outras idéias?
Eu posso recomendar a linha sIn. Close () se você quiser verificar algo.
Eu tinha o serviço funcionando, mas eu parei porque tinha funcionado por 2 horas e nunca tinha o ponto de parada que deveria ter atingido dentro de 10 minutos de mim, começando meu cliente. Eu não comentei a linha sIn. Close () agora e voltei a iniciar o serviço e o Cliente e tudo está funcionando como antes. 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, PRECISO fechar o fluxo de entrada para poder sair do processo conforme o esperado. Existem outras idéias?
Eu posso recomendar a linha sIn. Close () se você quiser verificar algo.
Como você está usando a entrada padrão e a saída padrão? Você está usando algum método ReadLine?
Peter, meu objetivo é:
Se você não chamar Dispose em um objeto que implemente (diretamente ou indiretamente) IDisposable, então você está apenas pedindo um bug. No entanto, não quero argumentar sobre isso sem parar. Você pode continuar a fazê-lo da maneira que você faz, e eu vou ficar com o meu. Enquanto não tivermos que manter o código de cada um, tudo bem.
E, a propósito, um "uso" de & quot; O bloco também não o protege. Nada impede que você declare a variável fora do bloco (se eu me lembro corretamente), então ainda pode estar no escopo após o fim do bloco. Você precisa ser diligente ao escrever o código correto. Se você declara isso no & quot; usando & quot; declaração, é uma maneira. Mas descartar o uso da abordagem try / finally apenas porque deixa a variável no escopo não é realmente o ponto. Ainda precisa ser Dispose () 'D em algum lugar.
Eu tinha o serviço funcionando, mas eu parei porque tinha funcionado por 2 horas e nunca tinha o ponto de parada que deveria ter atingido dentro de 10 minutos de mim, começando meu cliente. Eu não comentei a linha sIn. Close () agora e voltei a iniciar o serviço e o Cliente e tudo está funcionando como antes. 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, PRECISO fechar o fluxo de entrada para poder sair do processo conforme o esperado. Existem outras idéias?
Eu posso recomendar a linha sIn. Close () se você quiser verificar algo.
Como você está usando a entrada padrão e a saída padrão? Você está usando algum método ReadLine?
Mais uma vez, NÃO É uma Exceção que está sendo jogada, então não vejo detalhes de exceção. Eu não vou diretamente para o bloco catch no meu código, eu retomo DIRECTAMENTE após a chamada WaitForExit (). A janela que recebo é a mesma que você obtém quando CADA produto da Microsoft fecha inesperadamente e 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 (traduzido do japonês)
"Erros de aplicação Devenv. exe ocorrem, 8.0.50727.762 versão dos erros ocorridos módulo msvcr80.dll, versão 8.0.50727.762, erro ocorreu endereço 0x00039001.
Para obter mais informações, go. microsoft/fwlink/events. asp o Helo e o Centro de suporte, por favor consulte. & Quot;
Estou redirecionando a entrada padrão para passar nos diferentes comandos, porque eu estava tendo problemas para fazê-los funcionar como queria formar o StartInfo. Estou redirecionando os fluxos de Saída e Erro para verificar o que eles têm neles depois que o processo foi encerrado. Isso me permitirá verificar qualquer coisa que eu gostaria em qualquer fluxo, uma vez que terminamos. Eu também não permite que nenhum dos threads de redirecionamento de saída ou erro se junte até que o processo tenha passado a chamada WaitForExit.
Estou completamente perplexo.
Peter, meu objetivo é:
Se você não chamar Dispose em um objeto que implemente (diretamente ou indiretamente) IDisposable, então você está apenas pedindo um bug. No entanto, não quero argumentar sobre isso sem parar. Você pode continuar a fazê-lo da maneira que você faz, e eu vou ficar com o meu. Enquanto não tivermos que manter o código de cada um, tudo bem.
Eu não concordo. Não é um "erro" para não chamar Dispose. Seus recursos não serão liberados imediatamente, mas o GC os liberará se precisar da memória (assumindo que o padrão Dispose está corretamente implementado e existe um finalizador). Se a classe que você está usando implementa um & quot; Close & quot; método que não faz todas as mesmas coisas como "Dispose & quot ;, Close deve ser documentado como tal ou há um bug na classe. Eu nunca encontrei uma classe de estrutura que implemente IDisposable e um método Close () que introduzisse um "quilo" 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; disposto & quot; flag (usado para jogar ObjectDisposedException).
Na verdade, isso é detalhado na Referência Geral do Framework: & quot; Ocasionalmente, um nome específico do domínio é mais apropriado do que Dispose. Por exemplo, um encapsulamento de arquivo pode querer usar o nome do método Fechar. Nesse caso, implemente Dispose em 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 com um nome de método apropriado para seu domínio. & Quot; de Implementar finalizar e descartar para limpar recursos não gerenciados.
Bem como "Para certas classes de objetos, como arquivos ou objetos de conexão de banco de dados, um método Close melhor representa a operação lógica que deve ser executada quando o consumidor do objeto é concluído com o objeto. & Quot; de Melhorar o desempenho do código gerenciado (embora também também detalhe "Em casos bem escritos, ambos são funcionalmente equivalentes". Implica que usar Fechar é mais claro com "melhor representa".)
E, a propósito, um "uso" de & quot; O bloco também não o protege. Nada impede que você declare a variável fora do bloco (se eu me lembro corretamente), então ainda pode estar no escopo após o fim do bloco. Você precisa ser diligente ao escrever o código correto. Se você declara isso no & quot; usando & quot; declaração, é uma maneira. Mas descartar o uso da abordagem try / finally apenas porque deixa a variável no escopo não é realmente o ponto. Ainda precisa ser Dispose () 'D em algum lugar.
Mais uma vez, NÃO É uma Exceção que está sendo jogada, então não vejo detalhes de exceção. Eu não vou diretamente para o bloco catch no meu código, eu retomo DIRECTAMENTE após a chamada WaitForExit (). A janela que recebo é a mesma que você obtém quando CADA produto da Microsoft fecha inesperadamente e 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 (traduzido do japonês)
"Erros de aplicação Devenv. exe ocorrem, 8.0.50727.762 versão dos erros ocorridos módulo msvcr80.dll, versão 8.0.50727.762, erro ocorreu endereço 0x00039001.
Para obter mais informações, go. microsoft/fwlink/events. asp o Helo e o Centro de suporte, por favor consulte. & Quot;
Eu assumi que seu aplicativo estava gerando a mensagem (nesse caso, você sempre deve obter uma exceção e um rastreamento de pilha); não ficou claro que você retomasse depois da chamada para WaitForExit (). Parece-me que a aplicação que você está executando está terminando anormalmente. Você está executando devenv. exe? Não tenho certeza do que você pode fazer no seu aplicativo para impedir que outro aplicativo termine de forma anormal.
Estou redirecionando a entrada padrão para passar nos diferentes comandos, porque eu estava tendo problemas para fazê-los funcionar como queria formar o StartInfo. Estou redirecionando os fluxos de Saída e Erro para verificar o que eles têm neles depois que o processo foi encerrado. Isso me permitirá verificar qualquer coisa que eu gostaria em qualquer fluxo, uma vez que terminamos. Eu também não permite que nenhum dos threads de redirecionamento de saída ou erro se junte até que o processo tenha passado a chamada WaitForExit.
Estou completamente perplexo.
Daí o motivo pelo qual eu continue afirmando que não era uma exceção e que meu código ainda funcionava o resto do caminho até a conclusão, conforme esperado.
Assim. Existe alguma maneira de capturar uma exceção de aplicativo dentro de um processo em execução se ainda não foi encerrado. Isso será a verdadeira questão.
Bem, eu tentei usar FindWindow e FindWindowEx junto com SendMessage, mas não consegui encontrar o identificador de janela correto. Mas, como eu sei que uma caixa de Msssage de relatórios de erros do Windows aparecerá, verifiquei se era seu próprio processo (e é). O processo é dwwin. exe (Dr. Watson Win) e tudo o que eu tinha que fazer era isso para me permitir corrigir o problema atual. Substitua o atual bloco de código abaixo para a declaração WaitForExit () que eu tinha anteriormente.
Proc. WaitForExit (60000); // um minuto.
Processo [] ProcArray = Process. GetProcessesByName (& quot; dildin & quot;);
foreach (Process ProcessFound em ProcArray)
Eu também verifiquei se você conseguiu obter o Process. MainWindowTitle (), mas está definido como & quot; & quot ;. Então, isso é um hack e eu realmente não gosto de usá-lo, mas funciona para a execução atual.
A Microsoft está conduzindo 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.

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

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