Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

cant get process error output using process.ErrorDataReceived c#

Tags:

c#

process

I've built Form App that I use for some time , Now I want to Catch the StandardError of my process as well as its standartOutput

I've looked at answers in SO and MSDN and yet and cant get it right

My code :

        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();
        }

I've check it with Iperf and I see that when I run it with correct argument I get correct output but when I just send it with out any argumnet I see that with cmd I get

C:\>iperf.exe
Usage: iperf [-s|-c host] [options]
Try `iperf --help' for more information.

And my App I get Nothing !

what am I missing here ? Thanks

You can stop reading here ! If you want to see the details of inner method continue below :

    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();
    }
like image 987
LordTitiKaka Avatar asked Feb 08 '15 09:02

LordTitiKaka


1 Answers

I don't see a call to BeginErrorReadLine() anywhere in the code you posted. If you don't call that method, then the Process class won't actually redirect the stderr to your event handler.

I believe the above is the issue, but if you are actually calling that somewhere (and just didn't show it), then it is worth considering that there are some strange console programs out there that don't actually used stderr (or stdout) for error output. Instead, they write directly to the console window or some other non-standard mechanism. In those cases, you won't be able to receive the error output by redirecting stderr.

You can identify those programs by redirecting their output at the command like with e.g. iperf.exe 2> foo.txt. The stderr file handle is 2, and so that syntax redirects that file handle to a file named foo.txt. If the file is empty and you see errors on the screen, then the program is one of those strange programs.

But really, I think you probably just forgot to call BeginErrorReadLine(). :)

like image 58
Peter Duniho Avatar answered Oct 15 '22 21:10

Peter Duniho