C# 是否存在一个类似管道的.NET流类,它不';不要使用操作系统管道?

C# 是否存在一个类似管道的.NET流类,它不';不要使用操作系统管道?,c#,.net,mono,C#,.net,Mono,使用C#/.NET(Xamarin/Mono,真的) 我有一个类,它有一个方法(a),该方法接受它写入的流, 我还有另一个类,它有一个方法(B),它接受一个要读取的流 我希望有一个同时传递给(a)和(B)的流,这样当 (A) 写入流,则(B)可以读取该数据 已经有这样一种野兽不使用操作系统管道了吗?您可以围绕内存流创建一个,我们称之为并发内存流 您需要确保所有读写操作都是同步的。您还需要保留两个指针—一个用于读取,另一个用于写入,并在执行读取或写入操作之前找到正确的位置 哦,看看这个:,正如@m

使用C#/.NET(Xamarin/Mono,真的)

我有一个类,它有一个方法(a),该方法接受它写入的流, 我还有另一个类,它有一个方法(B),它接受一个要读取的流

我希望有一个同时传递给(a)和(B)的流,这样当 (A) 写入流,则(B)可以读取该数据


已经有这样一种野兽不使用操作系统管道了吗?

您可以围绕
内存流创建一个,我们称之为
并发内存流

您需要确保所有读写操作都是同步的。您还需要保留两个指针—一个用于读取,另一个用于写入,并在执行读取或写入操作之前找到正确的位置

哦,看看这个:,正如@mike z在评论中指出的。

我会使用。比如说

BlockingCollection<int> bc = new BlockingCollection<int>();
Task.Run(() => new Reader(bc).DoWork());
Task.Run(() => new Writer(bc).DoWork());
BlockingCollection bc=new BlockingCollection();
Task.Run(()=>newreader(bc.DoWork());
Task.Run(()=>newwriter(bc.DoWork());

公共类读取器
{
BlockingCollection_Pipe=null;
公共读卡器(堵塞收集管道)
{
_管道=管道;
}
公共工作
{
foreach(在_Pipe.getconsumineGenumerable()中的变量i)
{
控制台写入线(i);
}
控制台。写入线(“结束”);
}
}
公开课作家
{
BlockingCollection_Pipe=null;
公共写入程序(阻塞收集管道)
{
_管道=管道;
}
公共工作
{
对于(int i=0;i<50;i++)
{
_增加(i);
睡眠(100);
}
_管道。完成添加();
}
}

System.Collections.Concurrent.BlockingCollection
?有关“beast”一词的用法,请参见此+1。可能网络流看起来需要一个套接字才能使用网络流。MemoryStream没有一个用于读取的位置和一个用于写入的位置<代码>ms.WriteByte(1);WriteByte女士(2);var b1=m.ReadByte()b1将为-1.Hmmm,对。因此ConcurrentMemoryStream必须保持两个位置,并查找每个读写操作。这不是一个大问题。只是它根本不是并发的。这似乎是正确的语义,但我正在寻找流的派生,以便我可以插入它。这就像去家得宝,发现从来没有人制造过双头母接头!很抱歉,
没有内置方式,因此您只需将其插入即可。你必须付出一些努力才能得到它。我懒得给你写。
public class Reader
{
    BlockingCollection<int> _Pipe = null;
    public Reader(BlockingCollection<int> pipe)
    {
        _Pipe = pipe;
    }

    public void DoWork()
    {
        foreach(var i in _Pipe.GetConsumingEnumerable())
        {
            Console.WriteLine(i);
        }
        Console.WriteLine("END");
    }
}

public class Writer
{
    BlockingCollection<int> _Pipe = null;
    public Writer(BlockingCollection<int> pipe)
    {
        _Pipe = pipe;
    }

    public void DoWork()
    {
        for (int i = 0; i < 50; i++)
        {
            _Pipe.Add(i);
            Thread.Sleep(100);
        }
        _Pipe.CompleteAdding();
    }
}