2012-02-26 106 views
3

我在教自己使用管道,我有两个应用程序,一个使用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(); 
     } 
    } 

回答

4

的StreamReader关闭传递给它的处理后流,而你在年底处置的StreamReader using (StreamReader sr = new StreamReader(_pipeClient))块。

你可以在构造函数中一流水平打造的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); 
    } 
+1

此回答一个问题导致另一个。如果有其他人在这里找到方法,请访问:http://www.benday.com/2008/06/22/playing-with-nets-named-pipe-streams-with-net-to-net-and- win32-to-net-samples /#comment-284了解了如何做到这一点的完整示例,该示例远远优于Microsoft提供的内容。 – 2012-02-27 03:12:43

相关问题