public static AsyncProcess Start(ProcessStartInfo startInfo, IDictionary environment)
{
startInfo.RedirectStandardError = true;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
if (environment != null)
{
foreach (var i in environment.Keys)
{
startInfo.EnvironmentVariables[(string)i] = (string)environment[i];
}
}
var result = new AsyncProcess(new Process {
StartInfo = startInfo
});
result._process.EnableRaisingEvents = true;
// set up std* access
result._process.ErrorDataReceived += (sender, args) => {
result._stdError.Add(args.Data ?? string.Empty);
};
result._process.OutputDataReceived += (sender, args) => {
result._stdOut.Add(args.Data ?? string.Empty);
};
result._process.Exited += (sender, args) => {
result.WaitForExit();
result._stdError.Completed();
result._stdOut.Completed();
};
result._process.Start();
result._process.BeginErrorReadLine();
result._process.BeginOutputReadLine();
return(result);
}