Я ищу попытку начать процесс с F #, дождаться его завершения, но также прочитать его вывод постепенно.Запуск процесса синхронно и «потоковая передача» вывода
Это правильный/лучший способ сделать это? (В моем случае я пытаюсь выполнить команды Git, но по касательной к вопросу)
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
То, что я не понимаю, как proc.Start() может возвращать логическое значение, а также достаточно асинхронны для того, чтобы я получал выходной сигнал постепенно.
К сожалению, я не в настоящее время имеют достаточно большой репозитарий - или замедлить достаточно машину, чтобы быть в состоянии сказать, что порядок вещей происходит в ...
UPDATE
Я попытался Брайан предложение, и оно действительно работает.
Мой вопрос был немного расплывчатым. Мое недоразумение состояло в том, что я предположил, что Process.Start() вернул успех процесса в целом, а не только «Пуск», и, следовательно, я не мог видеть, как это работает .
У меня был некоторый успех с использованием асинхронных рабочих процессов для этой задачи: http://stackoverflow.com/questions/2649161/need-help-regarding-async-and-fsi – Stringer
На самом деле я не уверен, что вопрос Вот. Работает ли ваш код выше или нет? В чем проблема? –
Мне кажется, вы можете написать tester.exe, который пишет пару строк в stdout и flushes, ждет две секунды, пишет еще две строки, ... и использовать это, чтобы проверить, ведет ли этот код, как вы хотите, да? – Brian