Estoy tratando de intentar iniciar un proceso desde F #, espere hasta que termine, pero también lea su salida progresivamente.Iniciando un proceso de forma sincrónica y "transmitiendo" la salida
¿Es esta la mejor/la mejor manera de hacerlo? (En mi caso estoy tratando de ejecutar comandos de Git, pero que es tangencial a la pregunta)
let gitexecute (logger:string->unit) cmd =
let procStartInfo = new ProcessStartInfo(@"C:\Program Files\Git\bin\git.exe", cmd)
// Redirect to the Process.StandardOutput StreamReader.
procStartInfo.RedirectStandardOutput <- true
procStartInfo.UseShellExecute <- false;
// Do not create the black window.
procStartInfo.CreateNoWindow <- true;
// Create a process, assign its ProcessStartInfo and start it
let proc = new Process();
proc.StartInfo <- procStartInfo;
proc.Start() |> ignore
// Get the output into a string
while not proc.StandardOutput.EndOfStream do
proc.StandardOutput.ReadLine() |> logger
Lo que no entiendo es cómo el proc.Start() puede devolver un valor lógico y también ser lo suficientemente asíncrono para que pueda obtener la salida progresivamente.
Por desgracia, no tienen actualmente un repositorio suficientemente grande - o bastante lenta máquina, para ser capaz de decir qué orden las cosas están sucediendo en ...
ACTUALIZACIÓN
Traté de Brian sugerencia, y funciona.
Mi pregunta era un poco vaga. Mi malentendido fue que asumí que Process.Start() devolvió el éxito del proceso como un todo, y no solo del 'Inicio', y por lo tanto no pude ver cómo podría funcionar.
Tuve cierto éxito al utilizar flujos de trabajo asincrónicos para este tipo de tarea: http://stackoverflow.com/questions/2649161/need-help-regarding-async-and-fsi – Stringer
No estoy seguro de cuál es la pregunta aquí. ¿Su código anterior funciona o no? ¿Cuál es el problema? –
Me parece que podría escribir tester.exe, que escribe un par de líneas para stdout y flushes, espera dos segundos, escribe otras dos líneas, ... y la usa para probar si este código se comporta como usted desea, ¿sí? – Brian