не могу получить вывод ошибки процесса с помощью процесса.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(). :)