我当前的命名管道实现如下所示:
while (true)
{
byte[] data = new byte[256];
int amount = pipe.Read(data, 0, data.Length);
if (amount <= 0)
{
// i was expecting it to go here when a client disconnects but it doesnt
break;
}
// do relevant stuff with the data
}
如何正确检测客户端何时断开连接?
答案 0 :(得分:2)
设置读取超时并在发生超时时轮询NamedPipeClientStream.IsConnected
标志。
读取超时将导致在超时持续时间内空闲的读取抛出InvalidOperationException
如果您没有阅读,并且想要检测断开连接,请在工作线程上调用此方法,以获得管道连接的生命周期。
while(pipe.IsConnected && !isPipeStopped) //use a flag so that you can manually stop this thread
{
System.Threading.Thread.Current.Sleep(500);
}
if(!pipe.IsConnected)
{
//pipe disconnected
NotifyOfDisconnect();
}
答案 1 :(得分:1)
在之后使用WaitForPipeDrain()
方法写入管道(使用WriteByte()
或Write()
)并捕获&#34;管道已损坏的异常&# 34。
您可能希望将其置于while
循环中并继续写入管道。
答案 2 :(得分:0)
判断管道是否已损坏(远程)的一种简单方法是始终使用异步读取而不是同步读取,并且始终至少有一个异步提交的读取。也就是说,对于您获得的每个成功读取,发布另一个异步读取,无论您是否打算阅读另一个。如果关闭管道,或远程端关闭它,您将看到异步读取完成,但读取大小为空。您可以使用它来检测管道断开连接。不幸的是,管道仍然会显示IsConnected,你仍然需要手动关闭它,我想,但它确实可以让你检测出什么时候出现问题。