Eu vi muitas perguntas sobre stackoverflow e outros lugares sobre como executar um processo e capturar a saída de it8217s. Usar o System. Diagnostics. Process corretamente não é fácil e na maioria das vezes it8217s feito errado. Alguns erros comuns com System. Diagnostics. Process: Não capturar ambos os fluxos de saída (saída de saída de erro) Não redirecionar entrada pode causar aplicativos para travar Não fechar entrada redirecionada pode causar aplicativos para travar Não chamando BeginOutputReadLine / BeginErrorReadLine quando usando eventos Usando OutputDataReceived / ErrorDataReceived without Esperando por null Não verificando para null em manipuladores OutputDataReceived / ErrorDataReceived Esquecendo para definir EnableRaisingEvents true ao usar o evento Exited Forgetting ErrorDialog, CreateNoWindow ou UseShellExecute configurações Manipulação incorreta de StandardOutput ou StandardError leitores de fluxo Então, com isto dito, aqui estão algumas diretrizes básicas: Use Os eventos OutputDataReceived / ErrorDataRecieved NÃO o StandardOutput ou StandardError. Isto irá poupar-lhe um monte de dor de cabeça e gerenciamento de linha desnecessária. Sempre capturar toda a entrada E saída, se você don8217t plano para fornecer entrada, fechar o fluxo imediatamente. Seu processo não foi feito até que ele saiu E você leu todos os dados. OutputDataReceived CAN AND WILL ser disparado após uma chamada para WaitForExit () retorna. Você precisará de identificadores de espera para cada fluxo de saída e definirá o identificador de espera depois de receber os dados (nulos). Trackbacks Comentários Pesquisar Projetos Related Posts Copyright 2008-2017 por Roger Knapp, Todos os direitos reservados. Sua solução não precisa AutoResetEvent, mas você pesquisa. Quando você faz pesquisa em vez de usar o evento (quando eles estão disponíveis), então você está usando CPU sem razão e que indicam que você é um programador ruim. Sua solução é realmente ruim quando comparado com o outro 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, 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. Eu agora recebi uma janela popup Shell, que é indesejável, mas muito melhor do que o programa esperando nada particular acontecer. Então eu adicionei o seguinte work-around para que: Agora, a única coisa que me incomoda é por que isso está acontecendo no Windows 8 em primeiro lugar. Resposta Eu tenho o seguinte código, que funciona bem com outros aplicativos de console no entanto, não funciona com o aplicativo de console C, eu quero usar no projeto de aplicativo de desktop. O requisito é rastrear a saída do console para um aplicativo winforms e criar um relatório com base na interação do usuário adicional. FYI Eu não tenho o código-fonte para a aplicação de consola comigo, tem sido há idades inimigo agora e cliente quer que ele seja app desktop :). -------------------------------------------------- ---------------------------------------- Processar myProcess novo Process () string resultado quotquot quotD : RUTConsoleAppConsoleAppbinDebugConsoleApp. exequot //myProcess. StartInfo. FileName quotC: Arquivos de Programas7-Zip7z. exequot myProcess. StartInfo. UseShellExecute false //myProcess. StartInfo. CreateNoWindow true true myProcess. StartInfo. RedirectStandardOutput ambiente verdadeiro. NewLine textBox2.Text Environment. NewLine quotquot StreamReader sOut myProcess. StandardOutput //sIn. AutoFlush true Vocês podem me dizer por que o comportamento não está correto com o aplicativo de console C FYI, o que eu tentei é apenas um aplicativo simples que leva 3 parâmetros, primeiro 2 como número 3 Como operador ad deseja retun a soma ou multiplicação por agora. O aplicativo de console c real tem vários parâmetros que eu ainda não tentei com o aplicativo de área de trabalho. Você toma os dois números eo operador como argumentos de aplicação de console ou valores de entrada Se eles são valores de entrada de usuário, podemos usar Process. StandardInput. WriteLine () para inserir os valores. Eu usei estes códigos de teste para o aplicativo de console e aplicativo WinForm, o resultado de teste é muito bem: int a int. Parse (Console. ReadLine ()) int b int. Parse (Consola. ReadLine ()) string op Console. ReadLine () If (op quotquot) Console. WriteLine (ab) Processar myProcess novo Processo () StreamReader sOut myProcess. StandardOutput resultado de string sOut. ReadToEnd () Se você estiver tomando argumentos de aplicação de console, aqui estão meus códigos de teste: if (args. Length 3) Int int. Parse (args0) int b int. Parse (args1) se (args2 quotquot) Console. WriteLine (ab) Processar myProcess novo Process () myProcess. StartInfo. Arguments quot11 12 quot11 StreamReader sOut myProcess. StandardOutput string resultado sOut. ReadToEnd () Por favor, note. Se o texto de saída do console for grande, você também pode considerar usar o evento OutputDataReceived para recuperar o texto de saída. Se você tiver alguma dúvida, sinta-se livre para me informar. Espero que você tenha um bom dia Atenciosamente, Lingzhi Sun Assinante MSDN Suporte no Fórum Se você tiver algum feedback sobre o nosso apoio, entre em contato com msdnmgmicrosoft Lembre-se de marcar as respostas como respostas se eles ajudam e desmarcar-los se eles não fornecem nenhuma ajuda. Bem-vindo ao All-In-One Code Framework Se você tiver algum feedback, por favor nos avise. Marcado como resposta por NBaua Quinta-feira, setembro 24, 2009 7:34 AM quarta-feira, 23 de setembro de 2009 12:50 PM Eu usei a expressão lambda como o delegado do evento. Precisamos chamar BeginOutputReadLine para começar a receber o texto de saída. Em seguida, podemos colocar a lógica personalizada no OutputDataReceived processador de eventos delegado. Observe . O evento manipula o texto de saída de forma assíncrona em outro thread diferente do thread de UI principal do WinForm. Portanto, se você quiser acessar o WinForm UI durante o evento, use Control. BeginInvoke como o meu exemplo de código faz. Espero que você tenha um bom dia Atenciosamente, Lingzhi Sun Assinante MSDN Suporte no Fórum Se você tiver algum feedback sobre o nosso apoio, entre em contato com msdnmgmicrosoft Lembre-se de marcar as respostas como respostas se eles ajudam e desmarcar-los se eles não fornecem nenhuma ajuda. Bem-vindo ao All-In-One Code Framework Se você tiver algum feedback, por favor nos avise. Proposta como resposta por Michael Sun MSFT Funcionário da Microsoft, Moderador quarta-feira, setembro 30, 2009 3:12 Marcado como resposta por Michael Sun MSFT Funcionário da Microsoft, Moderador sexta-feira, 2 de outubro de 2009 11:25 quinta-feira, 24 de setembro de 2009 1: 46 PM Você toma os dois números e o operador como argumentos de aplicação de console ou valores de entrada Se forem valores de entrada de usuário, podemos usar Process. StandardInput. WriteLine () para inserir os valores. Eu usei estes códigos de teste para o aplicativo de console e aplicativo WinForm, o resultado de teste é muito bem: int a int. Parse (Console. ReadLine ()) int b int. Parse (Consola. ReadLine ()) string op Console. ReadLine () If (op quotquot) Console. WriteLine (ab) Processar myProcess novo Processo () StreamReader sOut myProcess. StandardOutput resultado de string sOut. ReadToEnd () Se você estiver tomando argumentos de aplicação de console, aqui estão meus códigos de teste: if (args. Length 3) Int int. Parse (args0) int b int. Parse (args1) se (args2 quotquot) Console. WriteLine (ab) Processar myProcess novo Process () myProcess. StartInfo. Arguments quot11 12 quot11 StreamReader sOut myProcess. StandardOutput string resultado sOut. ReadToEnd () Por favor, note. Se o texto de saída do console for grande, você também pode considerar usar o evento OutputDataReceived para recuperar o texto de saída. Se você tiver alguma dúvida, sinta-se livre para me informar. Espero que você tenha um bom dia Atenciosamente, Lingzhi Sun Assinante MSDN Suporte no Fórum Se você tiver algum feedback sobre o nosso apoio, entre em contato com msdnmgmicrosoft Lembre-se de marcar as respostas como respostas se eles ajudam e desmarcar-los se eles não fornecem nenhuma ajuda. Bem-vindo ao All-In-One Code Framework Se você tiver algum feedback, por favor nos avise. Marcado como resposta por NBaua quinta-feira, 24 de setembro de 2009 7:34 AM quarta-feira, 23 de setembro de 2009 12:50 PM Obrigado Lingzhi Sun, O aplicativo de teste funciona bem, como eu mencionei o aplicativo real tem vários parâmetros ea saída é grande que Eu preciso analisar e preparar o relatório com base no mesmo. como você mencionou. Quot Se o texto de saída do console for grande, você também pode considerar usar o evento OutputDataReceived para recuperar o texto de saída. Quot Você pode por favor me avise, como lidar com o evento acima, vai me ajudar a escrever a lógica personalizada para analisar a saída e enviá-lo para método (s) para calcular os valores e armazenar em um arquivo xml (que é usado Mais tarde para o relatório). Sim, você pode definitivamente adicionar sua própria lógica para analisar a saída, calcular e armazenar os dados em documentos XML. Para o exemplo na minha última postagem, podemos usar o evento OutputDataReceived como este: private void SetText () private void button1Click (object sender, EventArgs e) string caminho quot..ConsoleApplication1.exequot Processar myProcess new Process () myProcess. StartInfo. Argumentos quot11 12 quot myProcess. OutputDataReceived (s, ev) gt if (string. IsNullOrEmpty (ev. Data)) textBox1.BeginInvoke (new MethodInvoker (this. SetText)) Eu usei a expressão lambda como o delegado de eventos. Precisamos chamar BeginOutputReadLine para começar a receber o texto de saída. Em seguida, podemos colocar a lógica personalizada no OutputDataReceived processador de eventos delegado. Observe . O evento manipula o texto de saída de forma assíncrona em outro thread diferente do thread de UI principal do WinForm. Portanto, se você quiser acessar o WinForm UI durante o evento, use Control. BeginInvoke como o meu exemplo de código faz. Espero que você tenha um bom dia Atenciosamente, Lingzhi Sun Assinante MSDN Suporte no Fórum Se você tiver algum feedback sobre o nosso apoio, entre em contato com msdnmgmicrosoft Lembre-se de marcar as respostas como respostas se eles ajudam e desmarcar-los se eles não fornecem nenhuma ajuda. Bem-vindo ao All-In-One Code Framework Se você tiver algum feedback, por favor nos avise. Proposta como resposta por Michael Sun MSFT Funcionário da Microsoft, Moderador quarta-feira, setembro 30, 2009 3:12 Marcado como resposta por Michael Sun MSFT Funcionário da Microsoft, Moderador sexta-feira, 2 de outubro de 2009 11:25 quinta-feira, 24 de setembro de 2009 1: 46 PM
No comments:
Post a Comment