Redirecionar entrada padrão c # process waitforexit


Estou tentando iniciar um processo Em C (Java. exe executando um arquivo jar) em um thread separado e redirecionar seu StandardInput, StandardError e StandardOutput. Ive redirecionar com êxito StandardError e StandardOutput, mas estou tendo problemas com StandardInput. Estou iniciando o processo desta forma: O que eu preciso, então, é poder, no aplicativo windows forms, ter uma caixa de texto e um botão, onde eu possa inserir comandos que serão enviados para o processo StandardInput, mas não consigo encontrar uma maneira para redirecioná-lo fora da tarefa, pelo que estou ciente de que requer um streamWriter, mas não consigo encontrar uma maneira de escrever para ele quando ele está sendo executado em um thread separado. perguntou Ago 9 14 às 14:00 Você pode obter o StandardInput e StandardOutput antes de passá-los para a tarefa: Dessa forma, enquanto o processo vive, você pode acessar seus fluxos. Observe que você terá que adicionar uma verificação para certificar-se de que o processo ainda está ativo e, eventualmente, descartar seu StreamWriter e StreamReader em vez de usar um thread de threadpool apenas para bloquear aguardando WaitForExit. podemos registrar no evento assíncrono Process. Exited: System. Diagnostics. Process: redirect StandardInput, StandardOutput, StandardError 82218217 InputAndOutputToEnd: uma maneira prática de usar entrada / saída / erro redirecionada em uma p. 82218217 ltparam name8221p8221gtO p para redirecionar. Deve ter UseShellExecute definido como false. lt/paramgt 82218217 nome do ltparam8221StandardInput8221gtEsta string será enviada como entrada para a p. (deve ser Nothing if not StartInfo. RedirectStandardInput) lt / paramgt 82218217 nome do ltparam8221StandardOutput8221gtA saída do p8217s será coletada nesta string ByRef. (deve ser Nothing if not StartInfo. RedirectStandardOutput) lt / paramgt 82218217 nome do ltparam8221StandardError8221gtO erro p8217s será coletado nesta string ByRef. (deve ser Nothing if not StartInfo. RedirectStandardError) lt / paramgt 82218217 ltremarksgtEsta função resolve o problema de deadlock mencionado em msdn. microsoft/en-us/library/system. diagnostics. p.standardoutput. aspxlt/remarksgt ltRuntimepilerServices. Extension () gt Sub InputAndOutputToEnd (ByVal p Como Diagnostics. Process, ByVal StandardInput como String. ByRef StandardOutput como String. ByRef StandardError como String) Se p é Nothing Then Throw New ArgumentException (8220p deve ser não-nulo8221) 8216 Suponha que p foi iniciado. Infelizmente não há como verificar. Se p. StartInfo. UseShellExecute Em seguida, lançar New ArgumentException (8220Set StartInfo. UseShellExecute para false8221) Se (p. StartInfo. RedirectStandardInput ltgt (StandardInput IsNot Nothing)) Em seguida, lançar novo ArgumentException (8220Provide uma entrada não nula somente quando StartInfo. RedirectStandardInput8221) (p. StartInfo. RedirectStandardOutput ltgt (StandardOutput IsNot Nothing)) Em seguida, lançar novo ArgumentException (8220fornecer uma saída não nula somente quando StartInfo. RedirectStandardOutput8221) se (p. StartInfo. RedirectStandardError ltgt (StandardError não é nada)) em seguida, lançar novo ArgumentException (8220Provide um erro não nulo somente quando StartInfo. RedirectStandardError8221) Dim outputData As New InputAndOutputToEndData Dim errorData Como New InputAndOutputToEndData Se p. StartInfo. RedirectStandardOutput ThenComo redirecionar a saída do processo atual para a saída padrão. Obrigado pela resposta. Vou postar minha consulta novamente. Você parece estar assumindo que estou criando outro processo a partir de um processo. Esse não é o caso. O que estou fazendo aqui é que 1. Existem 2 processos separados e, portanto, independentes uns dos outros, 2. Um processo está enviando dados para o console 3. O segundo processo está tentando obter dados do Console do primeiro processo. Eu tentei definir essa propriedade p0.StartInfo. RedirectSta ndardOutpu t true Mas ainda dá exceção: quot StandardOut não foi redirecionado. quot Abaixo está o meu código .. 1o Código de processos: static void Main (string args) TextWriterTraceListener myWriter new TextWriterTraceListener ( Sy stem. Conso le. Out) Trace. Listeners. Add (myWriter) Trace. Write (quotHey. Quot) Trace. Write ("Como você está") StreamWriter standardOutput new StreamWriter (Console. OpenStandardOutput ()) standardOutput. AutoFlush true Console. SetOut (standardOutput) Console. Read Segundo Código de processos: static void Main (string args) Processo p Process. GetProcessesByName (quotaquot) if (p0 nulo) p0.StartInfo. RedirectSta ndardOutpu t string verdadeira s p0.StandardOutput. ReadTo End ( ) FileStream t File. OpenWrite (quotcv. txtquot) Console. Read () Agradecemos antecipadamente. Sagi

Comments