.net - 双向命名管道问题

标签 .net .net-3.5 named-pipes bidirectional

我有 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;
}

最佳答案

doIt() 中执行 outstream.Write(xml.ToString()) 后,您将尝试从 instream 读取数据。与此同时,您的另一个线程正在 stream.ReadToEnd() 中等待。它会永远等待,因为它不知道你已经写完了。据它所知,您完全可以再次调用 outstream.Write() 来写入更多数据。在您实际从 doIt() 关闭管道之前,ReadToEnd() 调用不会返回。

您可以通过让他们更智能地相互沟通来解决这个问题。例如,您可以将 xml.ToString() 的长度写入管道,然后写入字符串。然后在您的阅读器线程中,您首先读取长度,然后读取 msg_in,仅读取您期望发送的确切字节数,在读取完所有字节后立即停止,而不是等待管道被发送已关闭。

关于.net - 双向命名管道问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1309062/

相关文章:

.net - 如果安装了3.5,是否需要.net framework 2.0?

asp.net - 使用 ASP.NET 通过 POST 接收(和发送)XML

c++ - Windows 7 上的匿名命名管道

c# - 使用 LockBits 复制位图的矩形部分

java - C# - 等同于 java 的 ExpectedConditions.not

c# - 绑定(bind)列表和 LINQ?

c# - 进程间通信 - 现代选项?

c# - 指定的类型必须是不包含引用的结构

c# - .net4 中未调用托管 C++ 静态构造函数

pipe - Julia - 管道到 Julia REPL