如何继续从命名管道/流发送/读取消息

本文关键字:消息 读取 管道 何继续 继续 从命 | 更新日期: 2023-09-27 18:25:54

我正在自学使用管道,我有两个应用程序,一个是PipeServer类,另一个是PipeClient类(如下所示)。服务器应用程序创建一个PipeServer实例,并有一个文本框,当文本框更改时,该文本框将调用WriteMessage方法。客户端应用程序创建一个PipeClient实例,将MessageReadEvent设置为一个用给定消息填充文本框的方法,然后调用ReadMessages方法。

第一次调用ReadMessages方法时,它会到达sr.ReadLine()并在那里等待,直到收到消息。收到消息后,对sr.ReadLine()的下一次调用自然返回null,并继续退出该方法。

此时,对ReadMessages的任何进一步调用都会给我一个异常,表示管道已关闭。我不知道为什么管道要关上。我如何保持它打开?当然,我不必为我要发送的每条消息创建一个新的管道实例吗?

下面是我的PipeClient类。如果有帮助的话,我也可以添加我的PipeServer类,但我认为问题就在这里。。。

    public delegate void MessageReadEventHandler(string message);
    class PipeClient: IDisposable
    {
        public event MessageReadEventHandler MessageReadEvent;
        NamedPipeClientStream _pipeClient;
        public PipeClient(string pipeName)
        {
            _pipeClient = new NamedPipeClientStream(".", pipeName, PipeDirection.In);
            _pipeClient.Connect();
        }
        public void ReadMessages()
        {
            string temp;
            // Is _pipeClient getting disposed when sr gets disposed??
            // I wouldn't think so but I don't understand why I can't seem
            // to use it again after the following using statement is run
            using (StreamReader sr = new StreamReader(_pipeClient))
                while ((temp = sr.ReadLine()) != null)
                    if(MessageReadEvent != null)
                        MessageReadEvent(temp);
        }
        public void Dispose()
        {
            _pipeClient.Dispose();
        }
    }

如何继续从命名管道/流发送/读取消息

StreamReader关闭处理后传递给它的流,并且您正在using (StreamReader sr = new StreamReader(_pipeClient))块的末尾处理StreamReader。

您可以在构造函数中创建类级别的StreamReader,并在ReadMessages方法中使用它

  public PipeClient(string pipeName)
    {
        _pipeClient = new NamedPipeClientStream(".", pipeName, PipeDirection.In);
        _pipeClient.Connect();
        _streamReader = new StreamReader(_pipeClient);
    }
  public void ReadMessages()
    {
        string temp;

            while ((temp = _streamReader.ReadLine()) != null)
                if(MessageReadEvent != null)
                    MessageReadEvent(temp);
    }