Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当Startinfo.RedirectStandardOutput设置为true时,进程退出_C#_.net_Command Line_Process_Tfs - Fatal编程技术网

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

C# 当Startinfo.RedirectStandardOutput设置为true时,进程退出,c#,.net,command-line,process,tfs,C#,.net,Command Line,Process,Tfs,我正在尝试开发一个执行tfs合并的控制台应用程序。要执行的命令是: tf merge$/CodeBase/ALPHA$/CodeBase/BETA/recursive/version:C4~C6 当合并操作中存在冲突时,首先会引发一个错误,并出现一个“解决冲突”窗口,我在其中解决冲突。解决冲突后,将显示最终输出 对于执行tf合并的控制台应用程序,c#代码如下: Process proc = new Process(); proc.StartInfo.FileNam

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

tf merge$/CodeBase/ALPHA$/CodeBase/BETA/recursive/version: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


我相信我正在做异步读取操作(可能是这个问题)。有什么方法可以执行同步读取吗?

您必须附加EventHandler proc.ErrorDataReceived+=(s,e)=>ErrorLine(e.Data); proc.OutputDataReceived+=(s,e)=>OutputLine(e.Data)


问题在于TFS,如果它检测到stdout重定向,它将使用“/noprompt”执行。
通过设置环境变量TFS_IGNORESTDOUTREDIRECT=1,问题得以解决。

为什么不将代码包装在一个
try{}catch{}
中,并正确捕获异常?我已经将此代码放入了try-catch中。但没有异常发生这并不能解决问题:(.当我注释RedirectStandardError=true;时,仍会显示“解决冲突”窗口。如果没有,则不会显示。是否因为我正在执行异步读取操作?是否有一种方法可以同步等待输出响应。
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);
}