C#’System.InvalidOperationException’不能在进程流上混合同步和异步操作

我试图反复读取CMD进程,并重复打印输出,但我正在使用的while循环是在Task.Run内部,所以它不会锁定程序,但是有一些问题我不太了解的ASync和非ASync方法。 我知道我需要在Task.Run中没有pProcess.StandardOutput.ReadToEnd,但是如何在我的代码中实现它呢? 谢谢!

Task.Run(() => { while (true) { string output = pProcess.StandardOutput.ReadToEnd(); System.Console.Write(output); } }); 

在此处输入图像描述

你可以试试下面的代码片段吗? OutputDataReceived是异步读取进程输出的方法。

 var startInfo = new ProcessStartInfo { FileName = , UseShellExecute = false, // Required to use RedirectStandardOutput RedirectStandardOutput = true, //Required to be able to read StandardOutput Arguments =  // Skip this if you don't use Arguments }; using(var process = new Process { StartInfo = startInfo }) { process.Start(); process.OutputDataReceived += (sender, line) => { if (line.Data != null) Console.WriteLine(line.Data); }; process.BeginOutputReadLine(); process.WaitForExit(); } 

假设pProcessProcess一个实例, pProcess.StandardOutput是异步的,但由于.readToEnd()方法而一直读到最后。
我认为你不需要Task.Run或while循环。 查看https://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline%28v=vs.110%29.aspx上的示例

使用Task.Run在单独的任务中执行此代码没有问题我认为您之前在代码中调用了一些异步方法,如BeginErrorReadLine或BeginOutputReadLine。 这个SO答案可能有所帮助: 我试图在c#中读取进程的输出,但是我收到此消息“无法在进程流上混合同步和异步操作”。

我已经解决了您使用Standardoutput问题。
你必须为一个对象使用一次
string output = pProcess.StandardOutput.ReadToEnd();
要么

 pProcess.BeginOutputReadLine(); 

您不能在单个对象上同时使用它们。 因此,如果您想要读取输出并等待该过程未完成使用

 string output = pProcess.StandardOutput.ReadToEnd(); 

如果您不想阅读输出,只需简单就可以使用

 pProcess.BeginOutputReadLine(); 

你可以根据自己的需要同时使用,但不能同时使用。