Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.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#和#x27;系统无效操作异常';无法在进程流上混合同步和异步操作_C#_Asynchronous_Command Line - Fatal编程技术网

C#和#x27;系统无效操作异常';无法在进程流上混合同步和异步操作

C#和#x27;系统无效操作异常';无法在进程流上混合同步和异步操作,c#,asynchronous,command-line,C#,Asynchronous,Command Line,我试图反复读取CMD进程,并反复打印输出,但我使用的while循环在任务内部。请运行,以使其不会锁定程序,但异步和非异步方法存在一些问题,我不太了解。我知道我不需要在Task.Run中使用pProcess.StandardOutput.ReadToEnd,但是我如何在代码中实现它呢?谢谢 Task.Run(() => { while (true) { string output = pProcess.StandardOutp

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

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

请尝试以下代码片段,好吗
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();
}
var startInfo=新流程startInfo{
文件名=,
UseShellExecute=false,//需要使用RedirectStandardOutput
RedirectStandardOutput=true,//需要能够读取StandardOutput
Arguments=//如果不使用参数,请跳过此步骤
};
使用(var进程=新进程{StartInfo=StartInfo})
{
process.Start();
process.OutputDataReceived+=(发送方,行)=>
{
如果(line.Data!=null)
控制台写入线(行数据);
};
process.BeginOutputReadLine();
process.WaitForExit();
}

假设
pProcess
过程的一个实例,
pProcess.StandardOutput
是异步的,但是由于.readToEnd()方法的缘故,它会一直读取到最后。
我认为您不需要
任务。运行
或while循环。查看位于

的示例,在单独的任务中使用
任务执行此代码没有问题。运行
我认为您在代码之前的某个地方调用了一些异步方法,如BeginErrorReadLine或BeginOutputReadLine。这个答案可能会有帮助:

我已经解决了这个问题 您正在使用
标准输出


一个对象必须使用一次
string output=pProcess.StandardOutput.ReadToEnd()

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

string output = pProcess.StandardOutput.ReadToEnd();
如果您不想读取输出,只需使用simple即可

pProcess.BeginOutputReadLine();

当然,您可以根据需要使用这两种方法,但不能同时使用。

IMO您只需订阅,并记住在处理完流程后取消订阅事件,以及
process.BeginOutputReadLine()
是开始读取标准输出的代码(例如,事件处理程序中的数据是流程的标准输出)。并非所有相关代码都提供了,屏幕截图证明了这一点。事实上,错误消息告诉我们存在其他代码干扰此同步读取。该错误准确地说明了问题所在。由于缺少必需的代码,暂时关闭。另外,您需要根据指出问题的答案采取行动,并删除异步操作调用。这不会将cmd输出到程序输出D:请尝试在ProcessStartInfo中将
RedirectStandardOutput
设置为true。它需要能够读取标准输出。我将更新我的示例以反映这一点。真的很抱歉,但这仍然不起作用。D:如果您想在上下文中查看代码,这里有一个下载链接:(您需要将文件名更改为代码在计算机上的位置。)请将代码添加到您的问题中,而不是外部链接。这样,如果有人发现这很有用,代码将始终与问题一起出现。像这样的外部链接最终都会坏掉。但是。。。如果它不起作用,向其他人展示有什么意义?当问题解决后,我将把我的工作代码放入问题中。谢谢你的帮助我正在打电话给pProcess.BeginOutputReadLine();在Task.Run()之前,但我删除了它,但它没有修复它。请同时提供与pProcess相关的实例。因为你的案例现在无法复制。我已经编辑了我的代码,就像@LinuxSubmission所说的那样,并且已经丢失了代码D:对不起。我已经看过了,但它再次没有将任何命令行发布到控制台。这是我正在运行的代码,是否正确?string output=pProcess.StandardOutput.ReadToEnd();系统.控制台.写入(输出);pProcess.WaitForExit();当你说你看到“那个”时,你到底在说什么?链接中的示例实现了您想要的所有功能,并且可以正常工作。你应该能够使它适应你的目的。如果您想对代码提出具体建议,我们必须查看您的代码。您需要至少从
pProcess
对象的init开始发布。我指的是您发送的microsoft链接。下面是我的代码链接:所以我试着把它(微软网站上的代码)放到我的代码中,但没有成功。这是我的ATM机:
pProcess.BeginOutputReadLine();