我真的觉得我正在遵循MSDN的最佳做法。但是我很可能会丢失一些东西,因为我的代码从以下这一行继续:string errorOutput = cmd.StandardError.ReadToEnd();
后挂起。我在做什么错了?
var batchfile = File.OpenWrite("run.bat");
StreamWriter writer = new StreamWriter(batchfile);
writer.Write("dotnet run" + '\n');
//writer.Write("set /p temp=\"Hit enter to continue\"" + '\n');
writer.Close();
var cmd = new Process();
cmd.StartInfo.FileName = batchfile.Name;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.RedirectStandardError = true;
cmd.Start();
string errorOutput = cmd.StandardError.ReadToEnd();
cmd.WaitForExit();
var outputfile = File.OpenWrite("run_errorOut.txt");
StreamWriter outputWriter = new StreamWriter(outputfile);
outputWriter.Write(errorOutput);
outputWriter.Close();
以防万一:目前,此代码正在dotnetcore2.2应用程序(目标框架为'netcoreapp2.2')的xunit测试中运行。
答案 0 :(得分:3)
所以不久前我遇到了一个非常相似的问题,几乎完全一样,而我发现的是:
cmd.HasExited
为假,直到已读取StandardError / Output,以便无法用来检测何时完成(然后读取StandardError / Output)我发现最可靠的方法是使用Process
上提供的事件:
var outData = new StringBuilder();
var errData = new StringBuilder();
cmd.OutputDataReceived += (sender, args) => outData.Append(args.Data ?? string.Empty);
cmd.ErrorDataReceived += (sender, args) => errData.Append(args.Data ?? string.Empty);
然后在cmd.Start() == true
之后:
cmd.BeginErrorReadLine();
cmd.BeginOutputReadLine();
开始触发事件。
该过程结束后,您可以在StringBuilders上调用.ToString()
以获取数据:
Console.WriteLine(outData.ToString());
Console.WriteLine(errData.ToString());
(请注意,使用.ToString()
时Console.WriteLine
可以隐含)