首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#“System.InvalidOperationException”不能在处理流上混合同步和异步操作

C#“System.InvalidOperationException”不能在处理流上混合同步和异步操作
EN

Stack Overflow用户
提问于 2016-04-08 05:26:34
回答 4查看 3.7K关注 0票数 2

我试图重复地从CMD进程中读取,并重复打印输出,但是我正在使用的while循环在一个Task.Run中,这样它就不会锁定程序,但是ASync和非异步方法有一些问题,我不太理解。我知道我不需要在Task.Run中包含pProcess.StandardOutput.ReadToEnd,但是我如何在我的代码中实现它呢?谢谢!

代码语言:javascript
复制
Task.Run(() => 
    {
        while (true)
        {
            string output = pProcess.StandardOutput.ReadToEnd();
            System.Console.Write(output);
        }
     });

EN

回答 4

Stack Overflow用户

发布于 2016-04-08 05:44:59

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

代码语言:javascript
复制
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();
}
票数 3
EN

Stack Overflow用户

发布于 2016-04-08 05:49:52

假设pProcessProcess的一个实例,pProcess.StandardOutput是异步的,但由于.readToEnd()方法,它会一直读到最后。

我认为您不需要Task.Run或while循环。请查看https://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline%28v=vs.110%29.aspx上的示例

票数 1
EN

Stack Overflow用户

发布于 2016-04-08 05:50:20

使用Task.Run在单独的任务中执行这段代码是没有问题的,我认为你之前在代码中的某个地方调用了像BeginErrorReadLine或BeginOutputReadLine这样的异步方法。这个答案可能会有帮助: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."

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36487532

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档