Process.WaitForExit()
will wait until the asynchronous output / error stream reading finished. Unfortunately this is not true for Process.WaitForExit(timeout)
overload. This is what the Process
class does internally:
//…
finally
{
if (processWaitHandle != null)
{
processWaitHandle.Close();
}
if (this.output != null && milliseconds == -1)
{
this.output.WaitUtilEOF();
}
if (this.error != null && milliseconds == -1)
{
this.error.WaitUtilEOF();
}
this.ReleaseProcessHandle(safeProcessHandle);
}
… So it will wait for the async reads only if there was no timeout!
To fix it simply call the parameterless WaitForExit()
after WaitForExit(timeout)
returned true:
// …
if (process.WaitForExit( 10 * 1000 ) && process.WaitForExit() )
{
// Process'es OutputDataReceived / ErrorDataReceived callbacks will not be called again, EOF streams reached
}
else
{
throw new Exception("timeout");
}
For details read the remarks here: http://msdn.microsoft.com/en-us/library/ty0d8k56%28v=vs.110%29