如何继续从命名管道/流发送/读取消息
问题描述:
我在教自己使用管道,我有两个应用程序,一个使用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();
}
}
答
的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);
}
此回答一个问题导致另一个。如果有其他人在这里找到方法,请访问: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