【问题标题】:What is the purpose of maxNumberOfServerInstances in the NamedPipeServerStream class?NamedPipeServerStream 类中 maxNumberOfServerInstances 的用途是什么?
【发布时间】:2012-01-11 14:19:27
【问题描述】:

目前在 .NET 中编写 Windows 服务,我正在使用命名管道让其他进程与我的服务进行通信。在更复杂的 NamedPipeServerStream 构造函数中,有一个参数,其描述性名称为 maxNumberOfServerInstances。惊人的。但这意味着什么?

MSDN 的文档也有助于解释:

共享相同名称的服务器实例的最大数量。

好的。这仍然不能真正告诉我这对我有什么作用,或者我如何使用它。如果 NamedPipeServerStream 也接受了一些委托来“当我收到连接时运行此代码”,那么每个“服务器实例”都会运行该代码。但事实并非如此。

【问题讨论】:

  • 所以,9 年后,这个问题仍然没有答案。我认为在某种程度上添加评论可能会影响它。也许。种。
  • @RandomEngy 的answer 是正确的。

标签: .net windows-services named-pipes


【解决方案1】:

实际上,它限制了您可以为相同的管道名称创建的NamedPipeServerStream 实例的数量。这将抛出System.IO.IOException: All pipe instances are busy.:

var pipeStreamA = new NamedPipeServerStream("mypipe1", PipeDirection.InOut, 1);
var pipeStreamB = new NamedPipeServerStream("mypipe1", PipeDirection.InOut, 1);

如果更改为 -1 或 2,则不会引发异常。此外,它仅尊重您创建的第一个实例的值。如果在第一次调用时指定 1,在第二次调用时指定 2,它仍然会抛出异常。

将其设置为您希望尝试运行的同时服务器的最大数量可能是个好主意,因为正如 Hans 所提到的,它可能使用该数字作为要分配的资源量的提示。

【讨论】:

  • 这是正确答案。在我的评论here 中有更多细节。
【解决方案2】:

这是一个奇怪的论点,您可以在底层Windows API function (CreateNamedPipe) 的文档中找到更多关于它的信息。管道为管道缓冲区使用了非常宝贵的资源,它们是从非分页内核内存池中分配的。我认为这个论点有助于 Windows 优化池的使用。究竟如何做到这一点是无可救药的无证。

接受多个客户端连接的单个服务的完美数字是 1。如果您想运行多个服务都执行相同的工作,您只能增加它。这非常罕见。

【讨论】:

  • 我认为这不太对。每个并发客户端连接仅使用一个管道实例:您不能将多个客户端连接到同一个管道实例(同样,.NET NamedPipeServerStream 实例一次只能连接到一个客户端)。因此,使用 1 作为该参数的服务将序列化其所有客户端请求。相反,将其视为类似于连接池的大小 - 服务将希望将其设置为它能够处理的真正并发客户端请求的数量。
  • 在处理多客户端命名管道服务器时偶然发现了这一点,我同意@ChrisDickson。对于套接字,AcceptTcpClientAsync 为每个客户端提供了一个新的 TcpClient 实例。对于管道,如果我们想要多个并发客户端,则必须维护一个 NamedPipeServerStream 实例池,并在每个实例上主动调用 WaitForConnectionAsync。自然,每个连接仍然是一对一的管道,也就是说,我们不能让多个客户端写入服务器管道的同一个远程端。
【解决方案3】:

我用我的 VB 代码测试了这个问题,并将数字设置为 2。

Sub Main()
    Dim pipeserver As NamedPipeServerStream =
        New NamedPipeServerStream("myPipe", PipeDirection.InOut, 2,
                                  transmissionMode:=PipeTransmissionMode.Message)

    pipeserver.WaitForConnection()
    'some process
    Console.ReadLine()  'do not exit until any key pressed
End Sub

使用这个程序,如果我尝试启动第三个实例(EXE),“所有管道实例都忙”会发生异常。

我必须关闭一个实例,以便在实例数达到 2 时启动另一个实例。

所以我认为这个数字与客户端无关,它只是控制有多少管道服务器可以使用这个命名管道。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多