не могу получить вывод ошибки процесса с помощью процесса.ErrorDataReceived c#
Я построил Form
приложение, которое я использую в течение некоторого времени , теперь я хочу поймать StandardError
моего процесса, а также его standartOutput
Я посмотрел на ответы так и MSDN и все же и не могу получить его правильно
мой код :
public void RunProcess(string FileName, string Arguments,, bool IsPrintOutput = true)
{
process = new Process();
process.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent);
if (IsPrintOutput) process.OutputDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent);
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = FileName;
process.StartInfo.Arguments = Arguments;
if (EventWhenExit)
{
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(myprocess_Exited);
}
process.Start();
process.BeginOutputReadLine();
//run polling on stored logs to print them to screen
PollingService();
}
Я проверил его с Iperf и я вижу, что когда я запускаю его с правильным аргументом, я получаю правильный вывод но когда я просто отправляю его с любым argumnet, я вижу, что с cmd я получаю
C:>iperf.exe
Usage: iperf [-s|-c host] [options]
Try `iperf --help' for more information.
и мое приложение Я ничего не получаю !
что я пропустила ? Спасибо
вы можете прекратить чтение здесь ! Если вы хотите увидеть детали внутреннего метода, продолжайте ниже:
private void OnDataReceivedEvent(object sender, DataReceivedEventArgs e)
{
string ProcessOutput = e.Data;
ProcessLog.Add(e.Data);
}
private void PollingService()
{
var T = new Thread (()=>
{
while (true /* ProcessRunning*/)
{
if (ProcessLogIndex < ProcessLog.Count)
{
lock (this)
{
var tempList = ProcessLog.GetRange(ProcessLogIndex, ProcessLog.Count - ProcessLogIndex);
ProcessLogIndex = ProcessLog.Count;
foreach (var ToSend in tempList)
{
onDataOutputFromProcess(this, ToSend, sProcessNameID.ToString());
}
}
}
Thread.Sleep(400);
}
});
T.IsBackground = true;
T.Start();
}
1 ответов
Я не вижу вызов BeginErrorReadLine()
в любом месте в коде вас в курсе. Если вы не вызываете этот метод, то Process
класс фактически не перенаправляет stderr на ваш обработчик событий.
Я считаю, что это проблема, но если вы действительно вызываете это где-то (и просто не показывали его), то стоит учитывать, что есть некоторые странные консольные программы, которые на самом деле не использовали stderr (или stdout) для вывода ошибок. Вместо этого они пишут непосредственно в окно консоли или какой-то другой нестандартный механизм. В этих случаях вы не сможете получить вывод ошибки, перенаправив stderr.
вы можете идентифицировать эти программы, перенаправляя их вывод по команде, например,iperf.exe 2> foo.txt
. Дескриптор файла stderr -2
, и поэтому синтаксис перенаправляет этот дескриптор файла в файл с именем foo.txt
. Если файл пуст, и вы видите ошибки на экране, то программа является одной из этих странных программ.
но на самом деле, Я думаю, вы, вероятно, просто забыли позвонить BeginErrorReadLine()
. :)