Я пишу утилиту на C #, которая упростит управление несколькими репозиториями Mercurial в зависимости от того, как ее использует моя команда.Тем не менее, кажется, что всегда есть задержка в 300-400 миллисекунд, прежде чем я получаю что-то от hg.exe.Я использую код ниже для запуска hg.exe и hgtk.exe (графический интерфейс TortoiseHg).Код в настоящее время включает в себя секундомер и некоторые переменные для целей синхронизации.Задержка примерно одинакова при нескольких запусках в одном сеансе.Я также попытался указать точный путь к hg.exe и получил тот же результат.
static string RunCommand(string executable, string path, string arguments)
{
var psi = new ProcessStartInfo()
{
FileName = executable,
Arguments = arguments,
WorkingDirectory = path,
UseShellExecute = false,
RedirectStandardError = true,
RedirectStandardInput = true,
RedirectStandardOutput = true,
WindowStyle = ProcessWindowStyle.Maximized,
CreateNoWindow = true
};
var sbOut = new StringBuilder();
var sbErr = new StringBuilder();
var sw = new Stopwatch();
sw.Start();
var process = Process.Start(psi);
TimeSpan firstRead = TimeSpan.Zero;
process.OutputDataReceived += (s, e) =>
{
if (firstRead == TimeSpan.Zero)
{
firstRead = sw.Elapsed;
}
sbOut.Append(e.Data);
};
process.ErrorDataReceived += (s, e) => sbErr.Append(e.Data);
process.BeginOutputReadLine();
process.BeginErrorReadLine();
var eventsStarted = sw.Elapsed;
process.WaitForExit();
var processExited = sw.Elapsed;
sw.Reset();
if (process.ExitCode != 0 || sbErr.Length > 0)
{
Error.Mercurial(process.ExitCode, sbOut.ToString(), sbErr.ToString());
}
return sbOut.ToString();
}
Есть идеи, как мне ускорить процесс?Сейчас мне придется много кешировать в дополнение к многопоточности, чтобы сохранить пользовательский интерфейс.