【问题标题】:Is there a pipe-like .NET Stream class that doesn't use OS pipes?是否有不使用操作系统管道的类似管道的 .NET Stream 类?
【发布时间】:2014-01-26 00:08:13
【问题描述】:

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

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

我想要一个同时传递给 (A) 和 (B) 的流,这样当 (A) 写入流,数据可以被 (B) 读取。

是否已经有这种不使用操作系统管道的野兽?

【问题讨论】:

  • System.Collections.Concurrent.BlockingCollection ?
  • 看到这个question
  • +1 表示“野兽”一词的使用
  • 可能是网络流
  • 看来我需要一个 Socket 才能使用 NetworkStream。

标签: c# .net mono


【解决方案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();
    }
}

【讨论】:

  • 似乎是正确的语义,但我正在寻找 Stream 的衍生产品,以便我可以将其插入。这就像去 Home Depot 并发现没有人制造过双 -结束女性耦合!
  • 抱歉,so that you can just plug it in 没有内置方式。你必须付出一些努力才能得到它。懒得给你写了。
【解决方案2】:

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

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

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

【讨论】:

  • MemoryStream 没有一个读位置和一个写位置。 ms.WriteByte(1); ms.WriteByte(2); var b1 = m.ReadByte(); b1 将是 -1。
  • 嗯,对。所以 ConcurrentMemoryStream 将不得不保持两个位置,并寻找每个读取和写入。不是大问题。
  • 除了不并发根本
猜你喜欢
  • 2018-03-17
  • 2011-11-03
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多