Solved

Process.Exitcode returns wrong value

Posted on 2013-11-15
6
553 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 500 total points
ID: 39653964
As a test, you can try Process.WaitForExit, and see if the ExitCode is set.
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
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

On Demand Webinar - Networking for the Cloud Era

This webinar discusses:
-Common barriers companies experience when moving to the cloud
-How SD-WAN changes the way we look at networks
-Best practices customers should employ moving forward with cloud migration
-What happens behind the scenes of SteelConnect’s one-click button

Question has a verified solution.

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

Suggested Solutions

Title # Comments Views Activity
C# Linq Select From List 3 125
Visual Studio 2015 auto inserted code 12 86
Trigger C# code inside the SQL Server 6 55
Inserting LocalDB Table to SQL Server C# 3 43
Exception Handling is in the core of any application that is able to dignify its name. In this article, I'll guide you through the process of writing a DRY (Don't Repeat Yourself) Exception Handling mechanism, using Aspect Oriented Programming.
Calculating holidays and working days is a function that is often needed yet it is not one found within the Framework. This article presents one approach to building a working-day calculator for use in .NET.
This video shows how to use Hyena, from SystemTools Software, to update 100 user accounts from an external text file. View in 1080p for best video quality.

738 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