process.StandardOutput.ReadToEnd();
Этот вызов является блокирующим и будет ждать бесконечно, пока все выходные данные не будут сброшены в вызываемом процессе.
Это означает, что ваш вызов process.WaitForExit не нужен.Что вам действительно нужно сделать, это прочитать поток вывода в асинхронном режиме, чтобы вы могли выбрать, как долго вы будете ждать завершения вывода.
Вам также необходимо знать о других потоках, таких как StandardError, которые могуттакже содержат выходные данные.
В этой статье о переполнении стека есть несколько хороших примеров обоих этих случаев