Sunday 8 April 2018

C # process beginoutputreadline waitforexit


Sua solução não precisa de 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 à espera de nada particular aconteça. 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. Respondeu Jan 13 15 at 10:35 Exemplo de uso ImplementationI8217ve visto 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 fluxo leitores 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). Eu estou desenvolvendo um aplicativo de console C que inicia uma linha de comando e obtém alguns dados através de outro comando (o que é irrelevante nesta discussão). Eventualmente eu vou ter alguns dados na linha de comando e eu só preciso apenas a última linha do que. Eu usei o seguinte código: Process. StartInfo. FileName quotcmd. exequot Process. StartInfo. RedirectStandardInput true Process. StartInfo. RedirectStandardOutput true Eu usei o processo. StandardInput. WriteLine para escrever os comandos que eu preciso para o console. Mas se Process. StartInfo. RedirectStandardOutput true, não estou recebendo a saída necessária usando a instrução Process. StandardOutput. ReadToEnd (). Split (n) Considerando ReadLine opção está funcionando bem e estou recebendo a primeira linha do texto exibido. Desde everytime os dados que eu recebo no console difere, eu não posso hardcode qualquer loaction específico de onde obter minha saída. Mesmo se eu colocar um relógio sobre a instrução Process. StandardOutput. ReadToEnd (). Split (n) Estou recebendo uma exceção de tempo limite de função. Por favor me ajude com este problema. Quinta-feira, 07 de agosto de 2008 5:44 Então eu copiei código Manjus. Myprocesss quotcmd. exequot. Primeiro, enviei o comando quotipconfigquot, com um readToEnd () Tempo limite. Tentou ler em blocos, falhou também. Tentou waitForInputIddle (), mas esqueceu o cmd não tem interface gráfica, falhou também. Então eu precisava do cmd para terminar o stream se eu quisesse lê-lo. Ok, então saia Então eu tentei enviar TODOS os meus comandos, INCLUINDO o comando de saída primeiro, depois a leitura. SIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig / allquot) sIn. WriteLine (quotexitquot) string strOutPut sOut. ReadToEnd () Funciona como um encanto. Meu ReadToEnd () retorna uma seqüência de caracteres em meio segundo, e eu tenho todas as informações que eu preciso. -) Isso poderia ser de alguma ajuda para você, Gauri O improvável que fazemos, o impossível leva apenas um pouco mais. - Steven Parker Marcado como resposta por Jack 321 Segunda-feira, 11 de agosto de 2008 5:44 AM Segunda-feira, 07 de agosto de 2008 7:51 ReadToEnd () é apt causar deadlock, especialmente quando você código após um WaitForExit () ou enviar Um monte de entrada. O processo está escrevendo sua saída para um buffer, que tampão isnt muito grande (2KB eu acho). Se você não ler o conteúdo deste buffer, digamos com ReadLine (), o processo irá parar, esperando que o buffer seja esvaziado. Seu programa, por sua vez, irá parar porque WaitForExit () nunca retornará ou a chamada WriteLine () irá parar porque o processo não está mais lendo entrada. Se esse for o seu cenário, você precisará ler de forma assíncrona com BeginOutputReadLine (). Hans Passant. Marcado como resposta por Jack 321 segunda-feira, 11 de agosto de 2008 5:44 quinta-feira, 07 de agosto de 2008 12: 13 PM Todas as respostas Você também precisará definir Process. StartInfo. UseShellExecute como false. Marcado como resposta por Jack 321 segunda-feira, 11 de agosto de 2008 5:43 O acima é uma resposta padrão muito agradável, no entanto. Eu não acho que o quotcmdquot termina o fluxo. Não há nada sendo enviado FROM o cmd-box para indicar que o fluxo é encerrado. Considere uma página da web que você carrega, uma vez que o html-código inteiro chegou ao seu PC, o fluxo é feito. Mesmo com a leitura de um arquivo, uma vez que você chegou ao último caractere, o fluxo é feito. No entanto, com cmd, o fluxo não é quotdonequot. Ele apenas espera pela nova entrada, então se você lhe der outro comando, ele terá saída novamente. Hmm eu pareço ter problemas para me expressar novamente em inglês, minhas desculpas. De qualquer forma, eu não acho que há nada que você pode fazer para usar ReadToEnd () em um cmd-output-stream, a menos que você envie o comando quotexitquot. Você já tentou combinar o readline () com a. Uma análise da linha (isto é, você obtém linhas vazias), ou b. O comando Process. WaitForIddleInput () O improvável que fazemos, o impossível demora um pouco mais. - Steven Parker quinta-feira, 07 de agosto de 2008 7:35 No caso você está executando o processo cmd. Do remeber para escrever quotEXITquot no fluxo de entrada quinta-feira, 07 de agosto de 2008 7:51 AM Então eu copiei código Manjus. Myprocesss quotcmd. exequot. Primeiro, enviei o comando quotipconfigquot, com um readToEnd () Tempo limite. Tentou ler em blocos, falhou também. Tentou waitForInputIddle (), mas esqueceu o cmd não tem interface gráfica, falhou também. Então eu precisava do cmd para terminar o stream se eu quisesse lê-lo. Ok, então saia Então eu tentei enviar TODOS os meus comandos, INCLUINDO o comando de saída primeiro, depois a leitura. SIn. WriteLine (quotipconfigquot) sIn. WriteLine (quotipconfig / allquot) sIn. WriteLine (quotexitquot) string strOutPut sOut. ReadToEnd () Funciona como um encanto. Meu ReadToEnd () retorna uma seqüência de caracteres em meio segundo, e eu tenho todas as informações que eu preciso. -) Isso poderia ser de alguma ajuda para você, Gauri O improvável que fazemos, o impossível leva apenas um pouco mais. - Steven Parker Marcado como resposta por Jack 321 Segunda-feira, 11 de agosto de 2008 5:44 AM Segunda-feira, 07 de agosto de 2008 7:51 ReadToEnd () é apt causar deadlock, especialmente quando você código após um WaitForExit () ou enviar Um monte de entrada. O processo está escrevendo sua saída para um buffer, que tampão isnt muito grande (2KB eu acho). Se você não ler o conteúdo deste buffer, digamos com ReadLine (), o processo irá parar, esperando que o buffer seja esvaziado. Seu programa, por sua vez, irá parar porque WaitForExit () nunca retornará ou a chamada WriteLine () irá parar porque o processo não está mais lendo entrada. Se esse for o seu cenário, você precisará ler de forma assíncrona com BeginOutputReadLine (). Hans Passant. Marcado como resposta por Jack 321 segunda-feira, 11 de agosto de 2008 5:44 quinta-feira, 07 de agosto de 2008 12:13 Microsoft está conduzindo uma pesquisa on-line para entender a sua opinião sobre o site Msdn. Se você optar por participar, o questionário on-line será apresentado a você quando você deixar o site Msdn. Você gostaria de participar

No comments:

Post a Comment