Friday 20 July 2018

Processstartinfo c # 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, entrei em um problema com as implementações do Process StdOutStdError ReadLine em torno de minhas necessidades específicas, eu entro em como resolvi esse problema. Thread. WaitForExit () não está funcionando. Tenho um programa que execute bloco de notas como este: ProcessStartInfo myP new ProcessStartInfo () usando (Processar myp novo Processo ()) myp. StartInfo myP try myp. Start () myp. WaitForExit () Console. WriteLine (alles guttes) catch Console. WriteLine (falha) Isso está funcionando bem, alles guttes serão Executado depois de fechar o bloco de notas. Mas quando eu mudar o notepad. exe com o software de fornecedor de terceiros que processam arquivos e assim por diante, todos os guttes aparecem diretamente e parece que myp. WaitForExit não está funcionando. Eu perdi alguma coisa RE: Thread. WaitForExit () não está funcionando obislavu (Programmer) 21 Jan 05 09:27 O método WaitForExit () instrui o componente do processo a aguardar o número especificado de milissegundos ou indefinidamente para que o processo associado saia. Não tenho certeza do que você deseja implementar, mas acho que você deve usar o evento Exitado para capturar o término do processo: System. Diagnostics. Process myp new System. Diagnostics. Process (). Myp. EnableRaisingEvents true myp. StartInfo. UseShellExecute verificação falsa se isso for necessário myp. Exited new EventHandler (captureExit) myp. WaitForExit () myp. Start () private void captureExit (remetente de objeto, EventArgs e) System. Diagnostics. Process ps ( System. Diagnostics. Process) smer Combinar isso com objetos Mutex ou Monitor para controlar o segmento atual. (Veja os métodos WaitOne (), WaitAny (), Wait ()). - obislavu - Red Flag Enviado Obrigado por ajudar a manter os Fóruns Tek-Tips grátis de postagens inapropriadas. O pessoal da Tek-Tips verificará isso e tomará as medidas apropriadas. Responder a este tópico O lançamento nos fóruns Tek-Tips é um recurso exclusivo para membros. Clique aqui para participar do Tek-Tips e conversar com outros membros

No comments:

Post a Comment