You are calling ReadToEnd on your StreamReader. How exactly do you think that works? If you're going to read to the end of a stream then there has to be an end to read to, i.e. the method won't return until the stream has been closed, i.e. when the process has completed. If you want to display the output as it becomes available then you have to read it as it becomes available.