gpt4 book ai didi

.net - 双向命名管道问题

转载 作者:行者123 更新时间:2023-12-04 22:12:50 25 4
gpt4 key购买 nike

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

最佳答案

outstream.Write(xml.ToString())中执行doIt()之后,然后尝试从instream读取。同时,您的其他线程在stream.ReadToEnd()中等待。它会永远等待,因为它不知道您已经写完了。据它所知,您可以很好地再次调用outstream.Write()来写入更多数据。除非您实际上关闭了ReadToEnd()中的管道,否则doIt()调用不会返回。

您可以通过使它们彼此之间更智能地通信来解决此问题。例如,您可以将长度xml.ToString()写入管道,然后写入字符串。然后,在读取器线程中,您首先读取长度,然后读取msg_in,仅读取希望发送的确切字节数,在读取所有字节后立即停止,而不是等待管道关闭。

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com