.NET处理产卵问题
我已经从命令提示符下运行,瞬间,但使用的System.Diagnostics.Process催生时,不会出现以往任何时候都返回一个可执行文件:.NET处理产卵问题
基本上,我正在写一个.NET库封装在Accurev CLI界面中,因此每个方法调用都会生成CLI进程来执行命令。
这对所有的伟大工程,但一个命令:
accurev.exe show depots
然而,从控制台上运行这个时候,它运行良好,当我把它用.NET的过程,它挂起...的过程我使用的产卵码是:
public static string ExecuteCommand(string command)
{
Process p = createProcess(command);
p.Start();
p.WaitForExit();
// Accurev writes to the error stream if ExitCode is non zero.
if (p.ExitCode != 0)
{
string error = p.StandardError.ReadToEnd();
Log.Write(command + " failed..." + error);
throw new AccurevException(error);
}
else
{
return p.StandardOutput.ReadToEnd();
}
}
/// Creates Accurev Process
/// </summary>
/// <param name="command"></param>
/// <returns></returns>
private static Process createProcess(string command)
{
Log.Write("Executing Command: " + command);
ProcessStartInfo startInfo = new ProcessStartInfo();
Process p = new Process();
startInfo.CreateNoWindow = false;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.Arguments = command;
startInfo.FileName = _accurev;
p.StartInfo = startInfo;
return p;
}
它挂在p.WaitForExit()上。
有什么建议吗?
编辑:已解决!
.NET过程恒生如果输出缓冲区溢出,我转而使用异步读取方法,一切工作:
public static string ExecuteCommand(string command)
{
StringBuilder outputData = new StringBuilder();
Process p = createProcess(command);
p.OutputDataReceived += delegate(object sender, DataReceivedEventArgs e)
{
outputData.AppendLine(e.Data);
};
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();
// Accurev writes to the error stream if ExitCode is non zero.
if (p.ExitCode != 0)
{
string error = p.StandardError.ReadToEnd();
Log.Write(command + " failed..." + error);
throw new AccurevException(error);
}
else
{
return outputData.ToString();
}
}
而WaitForExit()正在执行是衍生的进程还活着吗?你可以附加一个调试器吗?
它正在寻求输入?特别是,我注意到你正在重定向标准输入,但没有关闭 - 所以如果它从标准输入读取它将挂起。
好吧,关闭 - 标准输出vs stdin ;-p – 2008-12-16 19:00:32
尝试一些替代WaitForExit()这样的:
while (!p.WaitForExit(100))
Console.Write(".");
的另一件事是尝试设置UseShellExecute为true,看着控制台窗口催生。请参阅此页以了解该参数的复杂性:http://blogs.msdn.com/jmstall/archive/2006/09/28/CreateNoWindow.aspx
由于海报是重定向输入,我怀疑这会起作用。 – 2008-12-16 19:08:47
您可能对[此帖子](http://www.codeducky.org/process-handling-net/)感兴趣,其中讨论了一些复杂的工作.NET以这种方式处理。 – ChaseMedallion 2016-01-16 19:26:47