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

时间:2016-04-07 21:26:34

标签: c# asynchronous command-line

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

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

enter image description here

4 个答案:

答案 0 :(得分:3)

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

var startInfo = new ProcessStartInfo {
    FileName = <Your Application>,
    UseShellExecute = false, // Required to use RedirectStandardOutput
    RedirectStandardOutput = true, //Required to be able to read StandardOutput
    Arguments = <Args> // 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();
}

答案 1 :(得分:1)

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

上的示例

答案 2 :(得分:1)

在单独的Task.Run任务中执行此代码没有问题我认为您之前在代码中调用了一些异步方法,如BeginErrorReadLine或BeginOutputReadLine。这个SO答案可能有所帮助:I am trying to read the output of a process in c# but I get this message "Cannot mix synchronous and asynchronous operation on process stream."

答案 3 :(得分:0)

我已经解决了这个问题 您正在使用Standardoutput
您必须对一个对象使用一次string output = pProcess.StandardOutput.ReadToEnd();
OR

pProcess.BeginOutputReadLine();

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

string output = pProcess.StandardOutput.ReadToEnd();

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

pProcess.BeginOutputReadLine();

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