English 中文(简体)
.NET处理产生问题
原标题:
  • 时间:2008-12-16 18:34:18
  •  标签:

我有一个可执行程序,它可以立即从命令提示符中运行,但是当使用System.Diagnostics.Process生成时似乎永远不会返回:

基本上,我正在编写一个围绕Accurev CLI接口的.NET库包装器,因此每个方法调用都会产生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()。

任何建议? (Rènhé jiànyì?)

编辑:已解决!

.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();
        }

    }   
问题回答

它正在寻找输入?特别是,我注意到您正在重定向stdin,但没有关闭它-因此,如果它正在读取stdin,它将挂起。

在WaitForExit()执行时,生成的进程是否仍然存在?您能够附加调试器吗?

尝试将WaitForExit()替换为类似以下的内容:

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

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





相关问题
热门标签