Mic*_*ker 5 .net c# named-pipes
我们有多个客户端通过命名管道连接到服务器。有时,pipe/file not found当客户端尝试连接到命名管道时,我们会看到一个错误。我们的原始代码是
while (!cancelToken.IsCancellationRequested)
{
// This creates a new NamedPipeServerStream
var stream = PipeHelper.NewCurrentUserServerStream(PipeNames.Server, PipeTransmissionMode.Byte);
await stream.WaitForConnectionAsync(cancelToken);
Task.Run(() => HandleStreamAsync(stream).WithExceptionTrapper(LogNamedPipeException));
Run Code Online (Sandbox Code Playgroud)
据我所知,NamedPipeServerStream应该先创建一个a ,然后再WaitForConnection调用它,然后服务器应处理该请求。
但是,如果该请求几乎是瞬时的,或者客户端关闭了管道,则在代码循环并创建新的服务器流之前,似乎服务器流将被关闭,整个命名管道将消失。
那么,无论连接客户端的时间和数量如何,我们如何确保命名管道在服务器的整个生命周期中都存在?
https://docs.microsoft.com/zh-cn/dotnet/standard/io/how-to-use-named-pipes-for-network-interprocess-communication处的代码表明,简单地使用多个线程是一种选项(在该示例中为4)。但是,这似乎只会减少出错的可能性,并且有可能让客户端尝试以极少的间隙进行连接,在该间隙中,所有4个线程都刚刚关闭了服务器流,并且命名管道消失了。此外,它将并行执行限制为4个线程。
是否有一种机制可以允许我们打开一个命名管道服务器,该服务器允许任意数量的连接,为每个连接创建一个新的服务器流,并且永远不会冒险关闭命名管道?
现在,我们正在考虑这样做:
var nextStream = PipeHelper.NewCurrentUserServerStream(PipeNames.Server, PipeTransmissionMode.Byte);
while (!cancelToken.IsCancellationRequested)
{
try
{
await nextStream.WaitForConnectionAsync(cancelToken);
var currentStream = nextStream;
// Always have another stream ready so if the task is handled and finished
// really quickly theres no chance of the named pipe being removed altogether.
nextStream = PipeHelper.NewCurrentUserServerStream(PipeNames.Server, PipeTransmissionMode.Byte);
Task.Run(() => HandleStreamAsync(currentStream).WithExceptionTrapper(LogNamedPipeException));
}
Run Code Online (Sandbox Code Playgroud)
这基本上可以确保我们在开始处理第一个服务器流连接之前创建第二个服务器流,因此可以确保始终有一个活动,并且我们在单独的任务上运行处理程序,因此应尽快启动另一个WaitForConnection。可能。
是否有一种框架模式可以使我们执行上述操作,支持任意数量的并行客户端,并确保只要服务器仍处于活动状态,就不会删除命名管道?
那么,我们如何确保命名管道始终存在,无论连接客户端的时间和数量如何?
这对于任何类型的网络服务器都是不可能的。即使 TCP/IP(命名管道构建于其上)也有有限的“积压”。即使您将待办事项修改得非常可笑,您仍然会受到服务器硬件的限制。
您可以做的就是始终保持一定数量的侦听调用(即WaitForConnectionAsync),因此始终有大量侦听器在运行,每个侦听器完成后立即开始新的侦听,就像您的上一个代码示例一样。您需要多次运行该代码,例如 20 次左右,这样您就有很多侦听器。您所能做的就是尽量减少错过连接的机会;你无法完全阻止它。
| 归档时间: |
|
| 查看次数: |
326 次 |
| 最近记录: |