【问题标题】:Implementing a Pipe in C# - which (stream?) classes to use?在 C# 中实现管道 - 使用哪些(流?)类?
【发布时间】:2011-05-30 23:50:31
【问题描述】:

我很难理解如何在 C# 中使用流。

我打算开一堂这种形式的课:

class Pipe {
    public void PutChar(char c) { ... }
    public char GetChar() { ... }
}

这个想法是,一个线程将通过其PutChar() 方法将字符放入此Pipe,然后其他线程将使用GetChar() 获取Pipe 中的字符。

在 Java 中,我会使用 PipedReaderPipedWriter 类。 C# 中似乎没有等效的类,那么我应该在这里使用哪些(流?)类?或者流不是实现这一点的正确方法?也许我最好使用Queue,而不是?

谢谢

【问题讨论】:

  • 我不清楚您是否正在寻找特定的命名管道操作系统实现,正如其他人所回答的那样。也许您正在查看一般意义上的管道?我

标签: c# stream pipe


【解决方案1】:

看看NamedPipe's。另请查看this 帖子。

【讨论】:

  • 我不想要 IPC。我不想要命名管道。
【解决方案2】:

System.IO.Pipes 命名空间中查找可以流式传输到管道的类。但是,您可能需要考虑 WCF 使用 NetNamedPipeBinding 在您的应用程序中实现管道。

【讨论】:

  • 这似乎比我假装的要“重”。我只想要一种跨线程而不是跨进程通信的方式。
  • 为什么需要跨线程通信?一个线程是某种工作者吗?
  • 是的,“左”线程是生产者,“右”线程是消费者。
  • 除非您特别需要控制工作线程,否则只需使用 ThreadPool 类对操作进行排队:msdn.microsoft.com/en-us/library/…。您可以以ThreadPool.QueueUserWorkItem(SomeMethod);ThreadPool.QueueUserWorkItem(obj => { Console.WriteLine(obj); }); 为例。
【解决方案3】:

StreamReader 和 StreamWriter 与 PipedReader 和 PipedWriter 非常相似。如果你声明一个 MemoryStream 来保存缓冲区,你可以实现它。

下面是一个快速代码示例,可以满足您的需求。

class Pipe {
    MemoryStream _ms;
    StreamReader _sr;
    StreamWriter _sw;

    public Pipe()
    {
       _ms = new MemoryStream();
       _sr = new StreamReader(_ms);
       _sw = new StreamWriter(_ms);
    }

    public void PutChar(char c) { _sw.Write(c) }
    public char GetChar() { return _sw.Read();  }
}

【讨论】:

  • 也许你的意思是 _sr.Read() ?无论哪种方式,它似乎都不起作用:(尝试向管道添加一些数据,然后使用 GetChar() 来获取它,我看到的都是-1。
  • 你是如何实例化和调用这些方法的?您是否确保您的线程使用相同的 Pipe 类实例?
  • 我认为 MemoryStream 只保持一个当前位置,而不是单独的读写位置。
【解决方案4】:

因为您想跨线程进行通信,并且不想使用上述答案中提到的任何 NamedPipes,而不是

1-您可以创建生产者消费者队列。

2- 如果您使用的是 .net 4.0,则可以使用 ConcurrentQueue

【讨论】:

    【解决方案5】:

    如果您使用的是 .NET 4.0,请查看 BlockingCollection 和 Task Parallel Library。这两个放在一起创造了一种使用任务跨线程移动数据的好方法。

    Example code on MSDN 显示您需要做的一切。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-21
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多