2008-12-16 81 views
6

我已经从命令提示符下运行,瞬间,但使用的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(); 
     } 

    } 
+0

您可能对[此帖子](http://www.codeducky.org/process-handling-net/)感兴趣,其中讨论了一些复杂的工作.NET以这种方式处理。 – ChaseMedallion 2016-01-16 19:26:47

回答

1

而WaitForExit()正在执行是衍生的进程还活着吗?你可以附加一个调试器吗?

2

它正在寻求输入?特别是,我注意到你正在重定向标准输入,但没有关闭 - 所以如果它从标准输入读取它将挂起。

+1

好吧,关闭 - 标准输出vs stdin ;-p – 2008-12-16 19:00:32

-2

尝试一些替代WaitForExit()这样的:

while (!p.WaitForExit(100)) 
    Console.Write("."); 

的另一件事是尝试设置UseShellExecute为true,看着控制台窗口催生。请参阅此页以了解该参数的复杂性:http://blogs.msdn.com/jmstall/archive/2006/09/28/CreateNoWindow.aspx

+0

由于海报是重定向输入,我怀疑这会起作用。 – 2008-12-16 19:08:47