Перенаправление ошибки STD & STDOut - PullRequest
1 голос
/ 08 февраля 2012

В настоящее время у меня возникают проблемы с перенаправлением как 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 Ответ

2 голосов
/ 08 февраля 2012

Почему бы просто не взять это:

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(), либо читать объекты потока, но не оба.

...