我正在教自己使用管道,我有两个应用程序,一个使用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();
}
}
答案 0 :(得分:4)
StreamReader关闭处理后传递给它的流,你在using (StreamReader sr = new StreamReader(_pipeClient))
块的末尾处理StreamReader。
您可以在构造函数中在类级别创建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);
}