C# 意外丢失或崩溃后重新连接到NamedPipeServerStream

C# 意外丢失或崩溃后重新连接到NamedPipeServerStream,c#,.net,named-pipes,C#,.net,Named Pipes,我有两个应用程序通过NamedPipes相互通信。让我们把它们称为appServer(服务器)和appClient(客户端)。他们成功地连接并在一段时间内来回发送数据。然后,appClient意外崩溃。用户重新启动它并尝试连接到管道,但appServer仍认为它已连接,因此未侦听新连接 我目前在服务器端使用NamedPipeServerStream(返回.IsConnected为true),在客户端使用NamedPipeClientStream(返回.IsConnected为false) 我的问

我有两个应用程序通过
NamedPipes
相互通信。让我们把它们称为
appServer
(服务器)和
appClient
(客户端)。他们成功地连接并在一段时间内来回发送数据。然后,
appClient
意外崩溃。用户重新启动它并尝试连接到管道,但
appServer
仍认为它已连接,因此未侦听新连接

我目前在服务器端使用
NamedPipeServerStream
(返回
.IsConnected
true
),在客户端使用
NamedPipeClientStream
(返回
.IsConnected
false

我的问题是:我能以某种方式让客户端能够重新连接吗?我显然已经尝试了
。连接
,有没有超时,但没有运气

任何提示都将不胜感激! 谢谢

编辑:
另一个有效(尽管不可取)选项是在服务器端执行一些便宜的操作,基本上做一个“连接测试”,以确保客户端“仍然存在”。有人知道其中之一吗?除了发送一条假消息之外,我不确定这样做的最佳方式。我不喜欢这个选项,因为它必须不断发生,但我现在对所有途径都开放。

我们的解决方案是启动第二个线程,等待另一个连接。然后我们比较了客户端,如果是同一个客户端,则关闭并回收原始服务器管道以保持其干净。

不幸的是,NamedPipeServerStream在您尝试发送带有i的内容之前不会检测到连接关闭t

最简单的解决方法是定期发送一条短消息,比如一个特定的字节,然后编程让客户端忽略它们


或者,您可以简单地定期关闭并重新打开两侧的连接,这会占用一些资源,但根据您的逻辑,可能更容易实现。

如果管道断开或断开连接,则应在服务器代码中引发IOException。您确定没有得到它(可能会抑制它吗?)你确定客户端进程会终止吗?在测试过程中,我是明确终止进程的人。我没有看到任何异常被抛出;你希望它被抛出到哪里?服务器基本上只是坐在那里等待。根据MSDN文档,我能做些什么来显式地引发一个“便宜”的异常例如,如果管道断开,服务器代码应该获得IOException。如果客户端崩溃(或者您为了测试而杀死它),我希望IOException会触发。你能发布一个小的代码示例来说明你看到的问题吗?我的代码位于
do while
循环中,该循环基于
IsConnected
为真。但是由于服务器没有接收到任何请求,因此没有任何代码触发,因此也没有异常。如果我可以添加一个辅助co对循环的指示基本上只是测试客户机是否存在这将是理想的,但我不确定如何做到这一点。上面链接中的示例代码在服务器端激发了多个线程。每个线程都可以接受连接。我确实认为,更好地理解服务器为什么等待已终止的客户机,而不是等待已终止的客户机试着解决这个问题。如果你能发布实际的代码,我或其他人可能会发现这个问题。