Program started via System.Diagnostics.Process hangs

T

test3

Hello folks,

I'm using System.Diagnostics.Process to start a thirdparty program
(that works perfectly when started via command line). I'm using
Process.StandardOutput to get the output of the program. That works
for 95 %, but the other 5 % it doesn't. It seems to me that the
started process just hangs, and therefor my program hangs, too
(p.WaitForExit()). I researched that this only happens when the output
of the program is longer than 4096 bytes: I killed the hung process,
WaitForExit returns and in StandardOutput is a string with a length of
4096 chars. The returned string contains the expected output of the
program, but is shortened to 4 KB.

Does somebody know why it hangs and how to fix this problem?

I'm using this code here:

static string GetProcessOutput(string cmd, string args, out string
error)
{
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo = new System.Diagnostics.ProcessStartInfo(cmd, args);
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.Start();
p.PriorityClass = System.Diagnostics.ProcessPriorityClass.High;
p.WaitForExit();

string output = p.StandardOutput.ReadToEnd();
error = p.StandardError.ReadToEnd();

return output.Trim();
}

Thanks in advance,

Benny Fischer.
 
C

Cor Ligthert [MVP]

Hi,

Remove the wait for exit and all other members, then it will works
perfectly as when started via command line as you wrote.

Cor
 
T

test3

Hi,

Remove the wait for exit and all other members, then it will works
perfectly as when started via command line as you wrote.

Cor

Thanks for your help Cor, it works perfectly now!

Greetings,
Benny
 
P

Peter Duniho

Hello folks,

I'm using System.Diagnostics.Process to start a thirdparty program
(that works perfectly when started via command line). I'm using
Process.StandardOutput to get the output of the program. That works
for 95 %, but the other 5 % it doesn't.

Cor's advice may have fixed the particular scenario. But you have a
more general problem, which is the possibility that the standard output
will wind up blocked because you haven't been reading from standard error.

In most cases, this may not be a problem, assuming the output to
standard error is brief. But it's a basic issue with redirection of the
Process class standard i/o streams: if you redirect more than one, you
need to make sure you are using some form of asynchronous access to send
or receive data from all of them as appropriate. Otherwise, the console
application winds up blocked trying to read or write to one of the
streams, causing a form of deadlock.

The documentation for the Process class has a good, detailed explanation
of this. It's helpful to read that if you intend to redirect the streams.

Pete
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top