Comportamiento aparentemente no determinista en este código que llama a un process externo

Tenemos la siguiente class en algún código de infraestructura. Es parte de una tarea de MSBuild que normalmente ejecuto desde PowerShell. Todos los commands de Git están disponibles para mí en mi entorno de PowerShell; este no es un problema de Git.

public class Git { public static string GetCurrentBranch() { Console.WriteLine("Trying to find current Git branch..."); string branch = null; /* git rev-parse --abbrev-ref HEAD */ var processStartInfo = new ProcessStartInfo("git", "rev-parse --abbrev-ref HEAD") { RedirectStandardOutput = true, RedirectStandardError = true, UseShellExecute = false }; var process = new Process(); process.ErrorDataReceived += (sender, args) => { branch += args.Data; }; process.OutputDataReceived += (sender, args) => { branch += args.Data; }; process.StartInfo = processStartInfo; process.Start(); process.BeginErrorReadLine(); process.BeginOutputReadLine(); process.WaitForExit(5000); // Potential failure point? Console.WriteLine("Git branch set to '{0}'", branch); return branch; } } 

La mayoría de las veces lo veo escribiendo resultados como este:

  Trying to find current Git branch... Git branch set to 'feature-multitenancy-steel-thread' 

Sin embargo, en ocasiones, y para mi disgusto, no he podido descifrar un patrón cuando esto sucede, obtengo un resultado como este:

 Trying to find current Git branch... Git branch set to '' 

y esto cuando definitivamente estoy en un repository de Git y git rev-parse --abbrev-ref HEAD definitivamente está devolviendo un nombre de twig si lo ejecuto directamente. Me preguntaba si la llamada WaitForExit() no estaba esperando el time suficiente y estaba saliendo antes de configurar la twig, pero cuando falla no parece tomar cinco segundos, y nunca he observado el command rev-parse para tomar todo ese time de todos modos.

Debido a que no puedo reproducir esta situación de forma consistente, me preguntaba si era obvio, por el código, si estamos usando Process incorrecto o algo así. ¿Algún gurú de C # /. NET que pueda hacer agujeros en este código?