?
Solved

Process.Exitcode returns wrong value

Posted on 2013-11-15
6
Medium Priority
?
580 Views
Last Modified: 2013-11-19
I've written a C# class that calls a DOS application in the context of a Process. The problem is that Process.Exitcode always returns 0 indicating success even if the DOS program fails. I've run this DOS application in a batch file from a command prompt, and I know it returns an error code. Here's my setup for the process:

        public void Start()
        {
            m_isDone = false;
            m_result = 0;
            m_isStandardOutputDone = false;
            m_isErrorOutputDone = false;
            m_consoleProcess = new Process();
            m_consoleProcess.StartInfo.FileName = m_command;
            m_consoleProcess.StartInfo.Arguments = m_commandArguments;
            m_consoleProcess.StartInfo.UseShellExecute = false;
            m_consoleProcess.StartInfo.CreateNoWindow = true;
            m_consoleProcess.StartInfo.RedirectStandardOutput = true;
            m_consoleProcess.StartInfo.RedirectStandardError = true;
            m_consoleProcess.OutputDataReceived += StandardOutputEventHandler;
            m_consoleProcess.ErrorDataReceived += ErrorOutputEventHandler;
            m_consoleProcess.Start();
            m_consoleProcess.BeginOutputReadLine();
            m_consoleProcess.BeginErrorReadLine();
        }

And the standard output event handler:

        private void StandardOutputEventHandler(object sendingProcess, DataReceivedEventArgs eventArgs)
        {
            String output = eventArgs.Data;
            if ( !String.IsNullOrEmpty(output) )
            {
                // Notify standard output event subscribers that there's new text.
                StandardOutputEvent(this, eventArgs);
            }
            else
            if ( (output == null) && m_consoleProcess.HasExited )
            {
                m_isStandardOutputDone = true;

                if ( m_isErrorOutputDone && !m_isDone )
                {
                    // Signal process completion.
                    m_isDone = true;
                    m_result = m_consoleProcess.Exitcode;
                    EventArgs e = new EventArgs();
                    if ( ProcessDoneEvent != null )
                    {
                        ProcessDoneEvent(this, e);
                    }
                }
            }
        }

It's here in the standard output event handler that I determine whether the process has completed and record the exit code. This works well, except that the exit code doesn't represent the correct output of the DOS program. How do I obtain the correct exit code?
0
Comment
Question by:alconlabs
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
  • 2
6 Comments
 
LVL 96

Expert Comment

by:Bob Learned
ID: 39653357
It doesn't look like you are waiting for the process to end, so the ExitCode won't be set yet.
0
 

Author Comment

by:alconlabs
ID: 39653940
m_consoleProcess.HasExited is true, so I assume the process has ended. The documentation for HasExited would seem to imply that if HasExited is true, it's safe to query the ExitCode and ExitTime properties, no?
0
 
LVL 96

Accepted Solution

by:
Bob Learned earned 1500 total points
ID: 39653964
As a test, you can try Process.WaitForExit, and see if the ExitCode is set.
0
VIDEO: THE CONCERTO CLOUD FOR HEALTHCARE

Modern healthcare requires a modern cloud. View this brief video to understand how the Concerto Cloud for Healthcare can help your organization.

 
LVL 23

Expert Comment

by:Ioannis Paraskevopoulos
ID: 39654127
I think you could store the exit code of the DOS app, and just 'return' it from your main sub.
0
 

Author Comment

by:alconlabs
ID: 39661333
WaitForExit didn't return, and the event handler for the Exited event didn't fire. Turns out I need to set EnableRaisingEvents to get these to work (though OutputDataReceived and ErrorDataReceived events work just fine without it). I'll give the points to TheLearnedOne since he got me headed down the right path.
0
 
LVL 96

Expert Comment

by:Bob Learned
ID: 39661340
Aah, yes, the needle-in-the-haystack...glad you found it.
0

Featured Post

What does it mean to be "Always On"?

Is your cloud always on? With an Always On cloud you won't have to worry about downtime for maintenance or software application code updates, ensuring that your bottom line isn't affected.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction This article series is supposed to shed some light on the use of IDisposable and objects that inherit from it. In essence, a more apt title for this article would be: using (IDisposable) {}. I’m just not sure how many people would ge…
The article shows the basic steps of integrating an HTML theme template into an ASP.NET MVC project
Visualize your data even better in Access queries. Given a date and a value, this lesson shows how to compare that value with the previous value, calculate the difference, and display a circle if the value is the same, an up triangle if it increased…
In this video, Percona Solutions Engineer Barrett Chambers discusses some of the basic syntax differences between MySQL and MongoDB. To learn more check out our webinar on MongoDB administration for MySQL DBA: https://www.percona.com/resources/we…

800 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question