我正在尝试使用以下代码从我的C#控制台应用程序启动mysqldump:
ProcessStartInfo procInfo = new ProcessStartInfo("mysqldump", "avisdb -uroot -p" + cs.Password);
procInfo.CreateNoWindow = true;
procInfo.RedirectStandardOutput = true;
procInfo.UseShellExecute = false;
Process proc = new Process();
proc.StartInfo = procInfo;
proc.Exited += new EventHandler(proc_Exited);
proc.Start();
proc.WaitForExit();
File.Delete("dump.sql");
StreamWriter dump = File.AppendText("dump.sql");
dump.Write(proc.StandardOutput.ReadToEnd());
dump.Flush();
dump.Close();
当我的数据库为空时,它运行良好,但是在填充数据库时需要永久...通过cmd启动命令只需几秒钟。我可以看到它停止在proc.WaitForExit()
上提前致谢!
答案 0 :(得分:1)
在StandardOutput.ReadToEnd()之前调用WaitForExit()会导致死锁情况,首先调用ReadToEnd(),你应该没问题。
来自MSDN的详细信息,http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx
代码示例避免了死锁条件 在p.WaitForExit之前调用p.StandardOutput.ReadToEnd。陷入僵局 如果父进程之前调用p.WaitForExit,则可能导致条件 p.StandardOutput.ReadToEnd和子进程写入足够的文本 填充重定向的流。父进程将无限期地等待 让子进程退出。子进程会等待 无限期地让父母从完整的StandardOutput中读取 流。