Process.StandardOutput.ReadToEnd();中的DeadLock问题;

时间:2009-09-25 07:52:36

标签: c# process deadlock

read这部分代码可能导致死锁:

 Process p = new Process();

 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.FileName = "Write500Lines.exe";
 p.Start();
 p.WaitForExit();
 string output = p.StandardOutput.ReadToEnd();

因为

  

如果出现死锁情况   父进程调用p.WaitForExit   在p.StandardOutput.ReadToEnd和之前   子进程写入足够的文本   填充重定向的流。该   父进程会无限期地等待   让子进程退出。该   子进程会无限期地等待   为父母从完整阅读   StandardOutput流。

但我不是为什么。我的意思是,在这种情况下,父进程是什么,孩子是什么?

2 个答案:

答案 0 :(得分:12)

简而言之,可能会发生这种情况:

应用程序A(上面的代码)启动子进程B并重定向标准输出。然后A等待B进程退出。当A等待B退出时,B产生输出到输出流(A已重定向)。此流具有有限的缓冲区大小。如果缓冲区变满,则需要清空缓冲区以便B能够继续写入缓冲区。由于A在B退出之前没有读取,因此最终可能会出现B等待输出缓冲区被清空的情况,而A将等待B退出。两个人都在等待对方采取行动,你就陷入了僵局。

您可以尝试以下代码来演示问题:

ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "cmd";
psi.Arguments = @"/c dir C:\windows /s";
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
Process p = Process.Start(psi);
p.WaitForExit();
string output = p.StandardOutput.ReadToEnd();

这将(很可能)产生输出流已满的情况,以便子进程(在这种情况下为"cmd")将等待它被清除,而上面的代码将等待{{ 1}}完成。

答案 1 :(得分:0)

父进程是调用p.Start()的进程。我想这是你的应用程序(调用者)。 子进程是p或换句话说是被调用者。

相关问题