Перенаправление ошибки STD & STDOut
В настоящее время у меня возникают проблемы с перенаправлением как STDError, так и STDOutput. То, что я хочу сделать, это когда возникает ошибка, которая будет напечатана в поле расширенного текста вместе с нормальным выводом, если не выдается ошибка.
Проблема у меня заключается в том, что, если я добавлю строку для перенаправления ошибки SDT:
string error = process1.StandardError.ReadToEnd();
rchsdtOut.Text = error;
Тогда мой обычный STD Out не перенаправляет на текстовое поле, но если есть напечатанная ошибка.
process1 = new System.Diagnostics.Process();
process1.StartInfo.UseShellExecute = false;
process1.StartInfo.RedirectStandardOutput = true;
process1.StartInfo.RedirectStandardError = true;
process1.StartInfo.CreateNoWindow = true;
process1.StartInfo.FileName = "java.exe ";
//String abc = txtSingleBar.Text.Replace("\\", "/");
toLoad = lstBarToLoad.Items[i].Text;
process1.StartInfo.Arguments = "-Xmx512M -jar";
process1.StartInfo.Arguments += toLoad;
Console.WriteLine(process1.StartInfo.Arguments);
try
{
process1.Start();
process1.OutputDataReceived += (s, a) => myMethod(a);
process1.BeginOutputReadLine();
string error = process1.StandardError.ReadToEnd();
rchsdtOut.Text = error;
}
Способ записи событий в текстовое поле
private void myMethod(DataReceivedEventArgs e)
{
if (e.Data != null)
{
Action action = () => rchsdtOut.Text += "\r\n" + e.Data.ToString();
rchsdtOut.BeginInvoke(action, null);
Console.WriteLine(e.Data.ToString());
}
}//end of private
По сути, я хочу, чтобы оба были перенаправлены, SDTOut и SDTError, если таковые возникнут.
Есть идеи?
1 ответ
Почему бы просто не принять это:
process1.OutputDataReceived += (s, a) => myMethod(a);
process1.BeginOutputReadLine();
и добавьте это: (Не забудьте добавить myErrorMethod
!)
process1.ErrorDataReceived += (s, a) => myErrorMethod(a);
process1.BeginErrorReadLine();
Тогда возьми это:
string error = process1.StandardError.ReadToEnd();
и вместо этого сделайте это (если вы хотите дождаться окончания):
process1.WaitForExit();
По сути, вы не можете смешивать синхронное и асинхронное чтение выходных данных. Вы должны либо использовать Begin_______ReadLine()
или читать объекты потока, но не оба.