C# 将Process StandardOutput连接到另一个Process StandardInput

C# 将Process StandardOutput连接到另一个Process StandardInput,c#,.net,C#,.net,我正在尝试在几个进程对象之间创建一个管道 我可以运行单个进程并捕获其StandardOutput,但是当我尝试连接多个进程对象时,第二个进程似乎没有从第一个进程的StandardInput接收任何数据 在这段代码中,我使用的是cat,它要么将其参数的内容打印到stdout,要么将stdin复制到stdout 使用一个流程就可以了: // Works private async void launchButtonClicked(object sender, EventArgs e) { v

我正在尝试在几个进程对象之间创建一个管道

我可以运行单个进程并捕获其StandardOutput,但是当我尝试连接多个进程对象时,第二个进程似乎没有从第一个进程的StandardInput接收任何数据

在这段代码中,我使用的是
cat
,它要么将其参数的内容打印到stdout,要么将stdin复制到stdout

使用一个流程就可以了:

// Works
private async void launchButtonClicked(object sender, EventArgs e)
{
    var outputBuffer = new MemoryStream();

    var tasks = new List<Task>();

    Process process1;

    {
        process1 = new Process();

        process1.StartInfo.FileName = "cat.exe";
        process1.StartInfo.Arguments = "K:\\temp\\streams.txt";
        process1.StartInfo.UseShellExecute = false;
        process1.StartInfo.RedirectStandardOutput = true;
        process1.StartInfo.RedirectStandardInput = false;
        process1.StartInfo.CreateNoWindow = true;
        process1.EnableRaisingEvents = true;
        process1.Start();
    }

    tasks.Add(process1.StandardOutput.BaseStream.CopyToAsync(outputBuffer));

    await Task.WhenAll(tasks);

    // OK: This prints the contents of the file
    Console.WriteLine("Final output: {0}", UTF8Encoding.UTF8.GetString(outputBuffer.GetBuffer()));

}
我尝试将退出的事件处理程序添加到这些流程对象中。进程1可以正常退出,但进程2永远不会退出

我也尝试了一些其他命令(比如sed),但Process2似乎仍然什么也没做

我正在使用流的基本流属性,因为我最终将使用二进制数据。()这也意味着我不能使用
OutputDataReceived
,它返回一个字符串(无论如何这会更复杂)


谢谢

显然,
CopyToAsync
不会在完成时关闭输出流。这对我的MemoryStream来说并不重要,但显然我需要关闭流程的StandardInput,否则它将永远无法完成

我提出了这个方法:

private static async Task CopyThenClose(Stream from, Stream to)
{
    await from.CopyToAsync(to);
    to.Close();
}
并替换了对
CopyToAsync
的调用;例如:

tasks.Add(CopyThenClose(process1.StandardOutput.BaseStream, process2.StandardInput.BaseStream));

您可能希望在运行之前设置流程输入和输出start@gashach在启动流程之前不能使用StandardOutput/Input,否则会出现异常:“StandardOut尚未重定向或流程尚未启动”。好的,在process 2上使用standartinput属性如何?
private static async Task CopyThenClose(Stream from, Stream to)
{
    await from.CopyToAsync(to);
    to.Close();
}
tasks.Add(CopyThenClose(process1.StandardOutput.BaseStream, process2.StandardInput.BaseStream));