2012-02-26 107 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