是否有类似管道的.NET Stream类不使用OS管道?

时间:2014-01-26 00:08:13

标签: c# .net mono

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

我有一个带有方法(A)的类,它接受它写入的流, 我有另一个类,方法(B)接受一个流来读取。

我希望有一个传递给(A)和(B)的流,这样就可以了 (A)写入流,可以通过(B)读取数据。

是否有这样的野兽不使用OS管道?

2 个答案:

答案 0 :(得分:1)

我会使用BlockingCollection。例如

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

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();
    }
}

答案 1 :(得分:0)

您可以在MemoryStream周围创建一个,我们称之为ConcurrentMemoryStream

您需要确保所有读取和写入都是同步的。您还需要保留两个指针 - 一个用于读取,另一个用于写入,并在读取或写入操作之前寻找适当的位置。

哦,看到这个:https://stackoverflow.com/a/12328307/871910,正如@mike z在评论中指出的那样。