Je cherche à démarrer un processus à partir de F #, attendre jusqu'à la fin, mais aussi lire progressivement.Démarrer un processus de manière synchrone et "diffuser" la sortie
Est-ce la bonne/meilleure façon de le faire? (Dans mon cas, je suis en train d'exécuter des commandes git, mais qui est tangente à la question)
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
Ce que je ne comprends pas comment le proc.Start() peut retourner une valeur booléenne et aussi être assez asynchrone pour que je puisse sortir progressivement de la sortie.
Malheureusement, je n'ai pas un dépôt assez grand - ou lent la machine assez, pour être en mesure de dire ce que les choses se passent dans l'ordre ...
MISE À JOUR
J'ai essayé de Brian suggestion, et cela fonctionne.
Ma question était un peu vague. Mon incompréhension était que je supposais que Process.Start() renvoyait le succès du processus dans son ensemble, et pas seulement du 'Start', et donc je ne pouvais pas voir comment cela fonctionnerait.
J'ai eu un certain succès en utilisant Asynchronous Workflows pour ce genre de tâche: http://stackoverflow.com/questions/2649161/need-help-regarding-async-and-fsi – Stringer
Je ne suis pas sûr de savoir quelle est la question ici. Est-ce que votre code ci-dessus fonctionne ou non? Quel est le problème? –
Il me semble que vous pourriez écrire tester.exe, écrire quelques lignes sur stdout et vider, attendre deux secondes, écrire deux autres lignes, ... et l'utiliser pour tester si ce code se comporte comme vous voulez, oui? – Brian