У меня был класс в 4.6.1, обновляющий интерфейс, который был в 4.6.2 ... обновление класса до 462 исправило его.
Я уже сталкивался с этим раньше. Иногда способ, которым процесс, которым вы вызываете выходные данные на консоль, несовместим с таким перенаправлением вывода. В этом случае мне повезло, что я смог изменить внешний процесс, чтобы обойти это.
Вы можете попробовать запустить свой код в другом процессе, который выводится на консоль, и посмотреть, правильно ли он работает. Мне прямо сейчас это читается.
РЕДАКТИРОВАТЬ:
Я пошел и вытащил блок кода, который использовал для этого. Это приложение WPF, которое перенаправляет вывод процесса в окно. Обратите внимание на привязку события. Поскольку это WPF, я должен вызвать свой вызов, чтобы записать данные. Поскольку вас не беспокоит блокировка, вы можете просто заменить это на:
Console.WriteLine(e.Data);
Надеюсь, это поможет!
private static void LaunchProcess()
{
Process build = new Process();
build.StartInfo.WorkingDirectory = @"dir";
build.StartInfo.Arguments = "";
build.StartInfo.FileName = "my.exe";
build.StartInfo.UseShellExecute = false;
build.StartInfo.RedirectStandardOutput = true;
build.StartInfo.RedirectStandardError = true;
build.StartInfo.CreateNoWindow = true;
build.ErrorDataReceived += build_ErrorDataReceived;
build.OutputDataReceived += build_ErrorDataReceived;
build.EnableRaisingEvents = true;
build.Start();
build.BeginOutputReadLine();
build.BeginErrorReadLine();
build.WaitForExit();
}
// write out info to the display window
static void build_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
string strMessage = e.Data;
if (richTextBox != null && !String.Empty(strMessage))
{
App.Instance.Dispatcher.BeginInvoke(DispatcherPriority.Send, (ThreadStart)delegate()
{
Paragraph para = new Paragraph(new Run(strMessage));
para.Margin = new Thickness(0);
para.Background = brushErrorBrush;
box.Document.Blocks.Add(para);
});
}
}
Я не уверен, с какой именно проблемой вы столкнулись, но если вы хотите действовать с выходом сразу после его создания, попробуйте подключиться к событию процесса OutputDataReceived
. Вы можете указать обработчики для асинхронного получения вывода от процесса. Я успешно использовал этот подход.
ProcessStartInfo info = new ProcessStartInfo(...)
info.UseShellExecute = false;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
Process p = Process.Start(info);
p.OutputDataReceived += p_OutputDataReceived;
p.ErrorDataReceived += p_ErrorDataReceived;
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();
..
void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Received from standard out: " + e.Data);
}
void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine("Received from standard error: " + e.Data);
}
Дополнительную информацию см. В событии OutputDataReceived off Process.
Использование лямбда-выражений и т.д.:
var info = new ProcessStartInfo(path)
{
RedirectStandardError = true,
RedirectStandardOutput = true,
UseShellExecute = false,
Verb = "runas",
};
var process = new Process
{
EnableRaisingEvents = true,
StartInfo = info
};
Action<object, DataReceivedEventArgs> actionWrite = (sender, e) =>
{
Console.WriteLine(e.Data);
};
process.ErrorDataReceived += (sender, e) => actionWrite(sender, e);
process.OutputDataReceived += (sender, e) => actionWrite(sender, e);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();