当Startinfo.RedirectStandardOutput设置为true时,进程退出

本文关键字:进程 退出 true Startinfo RedirectStandardOutput 设置 | 更新日期: 2023-09-27 18:24:18

我正在尝试开发一个执行tfs合并的控制台应用程序。要执行的命令是:

tf merge$/CodeBase/ALPHA$/CodeBase/BETA/递归/版本:C4~C6

当合并操作中存在冲突时,将首先引发一个错误,并在我解决冲突的位置设置一个解决冲突窗口。解决冲突后,将显示最终输出。

执行tf合并的控制台应用程序的c#代码如下:

Process proc = new Process();                
proc.StartInfo.FileName = "tf.exe";
proc.StartInfo.Arguments = " merge $/CodeBase/ALPHA $/CodeBase/BETA /version:C4~C6";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.RedirectStandardError = true;
proc.Start();
proc.WaitForExit();
string line1 = proc.StandardOutput.ReadLine();
string line2 = proc.StandardError.ReadToEnd();

问题:

进程突然退出,只显示初始错误消息。理想情况下,它应该等到我解决了所有的冲突,这个过程将一直等到那时。但由于我设置了proc.StartInfo.RedirectStandardError=true,应用程序并没有等待解决冲突窗口(甚至没有启动它)。但如果我评论这一行,它是正确的工作,但我不能阅读最终的输出。

请帮帮我。

编辑:7/23

我相信我正在做异步读取操作(可能是有问题的)。有没有一种方法可以让我执行同步读取???

当Startinfo.RedirectStandardOutput设置为true时,进程退出

您必须附加事件处理程序proc。ErrorDataReceived+=(s,e)=>ErrorLine(e.Data);proc。OutputDataReceived+=(s,e)=>OutputLine(e.Data);

void ErrorLine(string text)
{
    Console.ForegroundColor = ConsoleColor.White;
    Console.BackgroundColor = ConsoleColor.DarkRed;
    Console.Error.WriteLine(text);
    Console.ResetColor();
}
void OutputLine(string text)
{
    Console.Error.WriteLine(text);
}

问题出在TFS中,如果检测到stdout重定向,则使用'/noprompt'执行。通过设置环境变量TFS_IGNORESTOUTREDIRECT=1解决了问题。