客户端断开连接后在 .NET 4 中重用 NamedPipeServerStream 时 BeginWaitForConnection 引发的异常
Posted
技术标签:
【中文标题】客户端断开连接后在 .NET 4 中重用 NamedPipeServerStream 时 BeginWaitForConnection 引发的异常【英文标题】:Exception thrown by BeginWaitForConnection when reusing a NamedPipeServerStream in .NET 4 after client disconnects 【发布时间】:2011-05-18 13:43:45 【问题描述】:我正在尝试使用 NamedPipeServerStream
在 .Net 4 中创建命名管道服务器。我正在使用 BeginWaitForConnection
等待连接,以便在服务器关闭时中止等待下来。
对于第一个客户端来说一切正常 --- 连接被确认,数据被接收,响应被发送 OK。但是,在客户端断开连接后,一切都会中断。我再次打电话给BeginWaitForConnection
以等待新的连接,但这是抛出一个IOException
说“管道坏了”。
如何在同一管道上等待第二个客户端?
【问题讨论】:
【参考方案1】:创建一个NamedPipeServerStream
的新实例,指定相同的管道,然后调用BeginWaitForConnection
。
即不要尝试为不同的客户端重用 NamedPipeServerStream
对象:一个实例应该服务于一个客户端连接/对话,然后被释放。
另见Multithreaded NamePipeServer in C#
【讨论】:
【参考方案2】:使用单个客户端/服务器配置时的另一种方法是在客户端断开连接以清理管道时Disconnect
管道流。这允许重复使用管道。当您再次调用BeginWaitForConnection
时,它将开始接受连接。
while (true)
pipe.BeginWaitForConnection();
// read and write to pipe
// catch exception when client disconnects
pipe.Disconnect();
【讨论】:
您还必须小心不要处置/关闭与命名管道流一起使用的流读取器/写入器,因为它们将关闭基础流,然后就无法重用。以上是关于客户端断开连接后在 .NET 4 中重用 NamedPipeServerStream 时 BeginWaitForConnection 引发的异常的主要内容,如果未能解决你的问题,请参考以下文章