为什么当缓冲区大小增加到 4MB 时脚本挂起主机进程?



我们添加了Process class来执行脚本。脚本文件的 Main 方法将在下一节中定义。当脚本执行时,进程类的 WaitForExit() 方法每次都返回 false。

代码片段:

public void ExecuteTheScript()
{
.......

try  
{
System.Diagnostics.Process pProc = new System.Diagnostics.Process();
pProc.StartInfo.FileName = scriptPath;
pProc.StartInfo.Arguments = scriptArguments;
pProc.StartInfo.UseShellExecute = false;
pProc.StartInfo.RedirectStandardOutput = true;
pProc.StartInfo.RedirectStandardError = true;
pProc.StartInfo.WorkingDirectory = Path.GetDirectoryName(scriptPath);        
pProc.Start();
DateTime startTime = pProc.StartTime;

bool bHasExited = pProc.WaitForExit(120 * 1000);               

int timeElapsed = (int)(DateTime.Now - startTime).TotalSeconds;
if (timeElapsed >= timeoutInSeconds && !bHasExited)
{
if (sError == null)
sError = "timeout and not Exited Properly"
if (!pProc.HasExited)
pProc.Kill();
bOk = false;
}
_stdOut = pProc.StandardOutput.ReadToEnd();
_stdErr = pProc.StandardError.ReadToEnd();
if (pProcess.ExitCode != 0)
{
if (sError == null)
sError = pProc.ExitCode.ToString();
bOk = false;
}
}
catch (Exception e)
{   
if (sError == null)
sError = e.message;
bOk = false;
}
}

我们使用 Cscript 来执行脚本文件。

function main
{
var i;
var exit_Code = 0;
var str = "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" ;

for (i = 1; i <= 51; i++) {
WScript.Echo(str);
}
WScript.Quit(0);
}

来自 msdn:

该代码示例通过调用来避免死锁条件p.StandardOutput.ReadToEndp.WaitForExit之前.死锁条件 如果父进程在之前调用p.WaitForExit,则可能导致p.StandardOutput.ReadToEnd子进程写入足够的文本 填充重定向的流。父进程将无限期等待 以退出子进程。子进程将等待 无限期地供父级从完整的标准输出中读取 流。

最新更新