Redireccionar o padrão de saída waitforexit c # no Brasil


Eu tenho um aplicativo que chama outro processo em uma janela de comando e esse processo possui estatísticas de atualização que são enviadas para a janela do console. Eu pensei que esta era uma operação bastante simples, mas eu não consigo entender isso. Estou faltando algo? Idealmente, o que eu gostaria é como o resultado muda dentro desse processo que eu acertei ou os dados entram no leitor que eu obtenho eventos fora dele. Qualquer ajuda seria excelente, eu sinto que esta é uma questão de novato, mas parece que falta alguma coisa. Perguntou 17 de julho 09 às 22:33 Eu experimentei isso antes. Às vezes, a forma como o processo que você está chamando de saídas para o console não é compatível com esse tipo de redirecionamento de saída. Naquele caso, tive a sorte de poder modificar o processo externo para evitar isso. Você pode tentar executar seu código em outro processo que saia para o console e veja se ele funciona corretamente. Ele me lê direito agora. Eu fui e puxei um bloco de código que eu costumava fazer. Isso está em um aplicativo WPF que redireciona a saída do processo para a janela. Observe a ligação do evento. Como isso é WPF, tenho que invocar minha chamada para escrever os dados. Uma vez que você não está preocupado com o bloqueio, você poderia simplesmente substituir isso com: Espero que ele ajude Curiosamente, você não consegue ler da saída padrão e erro padrão ao mesmo tempo: se você redirecionar a saída padrão e o erro padrão e tentar ler ambos , Por exemplo, usando o seguinte código C. Saída de cadeia p. StandardOutput. ReadToEnd () erro de cadeia p. StandardError. ReadToEnd () Neste caso, se o processo filho escrever qualquer texto para erro padrão, ele bloqueará o processo, porque o processo pai não pode ler de erro padrão até que ele tenha Terminou a leitura da saída padrão. No entanto, o processo pai não será lido a partir da saída padrão até o processo terminar. Uma solução recomendada para esta situação é criar dois tópicos para que seu aplicativo possa ler a saída de cada fluxo em um thread separado. Elina: obrigado pela sua resposta. Há algumas notas na parte inferior deste MSDN doc (msdn. microsoften-uslibraryhellip) que alertam sobre potenciais bloqueios se você ler ao final de ambos os fluxos stdout e stderr redirecionados de forma síncrona. É difícil dizer se sua solução é suscetível a esse problema. Além disso, parece que você está enviando o process39 stdoutstderr output novamente na entrada. Por quê. ) Ndash Matthew Piatt 26 de setembro 16 às 4:42 Esta é uma solução baseada em TPL (Task Parallel Library) mais moderna e esperada para. NET 4.5 e acima. Exemplo de uso Implementação respondida 5 de outubro 16 às 10:54 Eu acho que isso é uma abordagem simples e melhor (não precisamos de AutoResetEvent): respondido 14 de junho 12 às 14:29 Verdadeiro, mas não deveria estar fazendo. FileName Path quotggsci. exequot quot lt Obeycommand. txtquot para simplificar o seu código também Ou talvez algo equivalente a quotggsci. exequot do quot do comando quotecho se você realmente não quiser usar um arquivo obeycommand. txt separado. Ndash Amit Naidu Jun 4 13 at 22:03 Sua solução não precisa de AutoResetEvent, mas você pesquisa. Quando você faz uma pesquisa em vez de usar o evento (quando está disponível), você está usando a CPU sem motivo e isso indica que você é um programador ruim. Sua solução é realmente ruim quando comparada com a outra usando AutoResetEvent. (Mas não te dou -1 porque voce tentou ajudar). Ndash Eric Ouellet Nov 7 14 às 18:38 Eu estava tendo o mesmo problema, mas a razão era diferente. No entanto, isso 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. Agora recebi uma janela popup do Shell, que é indesejável, mas muito melhor do que o programa esperando que nada de particular aconteça. Então eu adicionei o seguinte trabalho para isso: agora, o único problema que me incomoda é o porquê isso está acontecendo no Windows 8, em primeiro lugar. Respondeu 13 de janeiro 15 às 10:35 Tentei fazer uma aula que resolva seu problema usando a leitura de fluxo assíncrono, levando em conta Mark Byers, Rob, Stevejay responde. Ao fazê-lo, percebi que existe um bug relacionado à leitura assíncrona do fluxo de saída do processo. Você não pode fazer isso: você receberá System. InvalidOperationException. StandardOut não foi redirecionado ou o processo ainda não começou. Então, você deve iniciar a saída assíncrona lida depois que o processo for iniciado: fazendo isso, faça uma condição de corrida porque o fluxo de saída pode receber dados antes de configurá-lo como assíncrono: então, algumas pessoas podem dizer que você só precisa ler o fluxo antes de você Configure-o para assíncrono. Mas o mesmo problema ocorre. Haverá uma condição de corrida entre a leitura síncrona e configurará o fluxo em modo assíncrono. Não há como obter uma leitura assíncrona segura de um fluxo de saída de um processo da maneira atual Process e ProcessStartInfo foi projetado. Você provavelmente está melhor usando a leitura assíncrona, como sugerido por outros usuários para o seu caso. Mas você deve estar ciente de que você pode perder algumas informações devido à condição de corrida.

Comments

Popular Posts