2009-08-20 88 views
2

我有2个应用程序,我想通过.NET 3.5上的命名管道进行通信。它是一个请求/响应范例,数据以XML格式传输,让我的生活更轻松。有一个监听器应用程序和一个将请求发布到管道的应用程序。我试图用双向管来做到这一点。我遇到的问题是对StreamReader.ReadToEnd()的调用似乎不会返回。我能做些什么来解决这个问题?双向命名管道问题

监听器代码

public Class Listener 
{ 
    private void ThreadFunc() 
    { 
     var pipe = new NamedPipeServerStream("GuideSrv.Pipe",PipeDirection.InOut); 
     var instream = new StreamReader(pipe); 
     var outstream = new StreamWriter(pipe); 
     while (true) 
     { 
      pipe.WaitForConnection(); 
      var response = ProcessPipeRequest(instream); 
      outstream.Write(response.ToString()); 
      pipe.Disconnect(); 
     } 
    } 
    private XDocument ProcessPipeRequest(StreamReader stream) 
    { 
     var msg_in = stream.ReadToEnd(); // << This call doesnt return 
     var xml_in = XDocument.Parse(msg_in); 
     // do some stuff here 
     return new XDocument(....); 
    } 
} 

委托代码

public XDocument doIt() 
{ 
    var xml = new XDocument(....); 
    using (var pipe = new NamedPipeClientStream(".", "GuideSrv.Pipe", PipeDirection.InOut)) 
    { 
     using (var outstream = new StreamWriter(pipe)) 
     using (var instream = new StreamReader(pipe)) 
     { 
      pipe.Connect(); 
      outstream.Write(xml.ToString()); 
      xml = XDocument.Parse(instream.ReadToEnd()); 
     } 
    } 
    return xml; 
} 

回答

6

后你outstream.Write(xml.ToString())doIt()你再试试从instream阅读。同时你的另一个线程正在等待stream.ReadToEnd()。它会永远等待,因为它不知道你写完了。据知道你可以再次致电outstream.Write()来写更多的数据。只有在您实际关闭doIt()的管道时,ReadToEnd()呼叫才会返回。

您可以通过使它们彼此更加智能地进行通信来解决此问题。例如,您可以将长度xml.ToString()写入管道,然后写入字符串。然后在读者线程中,首先读取长度,然后读取msg_in,只读取您期望发送的确切字节数,一旦全部读取而停止,而不是等待管道关闭。