【问题标题】:What are named pipes (net.pipe) limitations?什么是命名管道 (net.pipe) 限制?
【发布时间】:2012-09-13 11:23:53
【问题描述】:

我有一个循环运行的程序,每次迭代都在不同的线程中运行,我正在创建打开新服务主机的新进程:

ServiceHost _host = new ServiceHost(_service, new Uri("net.pipe://localhost/" + i_PipeName));
_host.AddServiceEndpoint(typeof(ICommandService), new NetNamedPipeBinding() { TransferMode = TransferMode.Buffered }, i_PipeName);
_host.Open();

在我的主程序中,我通过以下方式连接到开放的 .net 管道:

ICommandService ServiceProxy = ChannelFactory<ICommandService>.CreateChannel
(new NetNamedPipeBinding(), new EndpointAddress(@"net.pipe://localhost/" + i_PipeName" + @"/" + i_PipeName));

所以我的问题是,对于前 200 多个过程/迭代它工作正常,我可以打开连接并传递消息,但后来开始出现错误:

没有端点监听 net.pipe://localhost/pipea0360/pipea0360 可以接受 信息。这通常是由不正确的地址或 SOAP 操作引起的。 如果存在,请参阅 InnerException,了解更多详细信息。

我的问题是我可以并行打开的管道数量是否有任何限制?
是不是因为我开了这么多进程?

【问题讨论】:

  • 您是否遵循异常的建议来See InnerException?它可以帮助您确定问题的实际原因。也许您可以将内部异常的描述编辑到您的问题中。
  • @MvanGeest 内部异常与外部异常相同:net.pipe://localhost/pipea0360/pipea0360 上没有可以接受消息的端点侦听。
  • 您正在为每个 _host 创建一个新线程,因此您要创建 200 多个线程?为什么?我非常有信心最佳线程数少于 200。为什么超过 200 _host?
  • 我正在模拟多个并行登录
  • 好的,为什么超过 200 个线程?为什么你认为这是多个管道的问题?您是否认为这可能是线程数问题?

标签: c# .net named-pipes net.pipe


【解决方案1】:

您是否排除了竞争条件,即客户端试图连接到服务器尚未建立的管道?如果服务器上有很多活动线程,则很容易延迟应该开始侦听的线程。这可以解释为什么它在一开始就有效。

一般来说,每个客户端都有一个服务器线程并不能很好地扩展;使用线程池方法可以获得更好的性能。

【讨论】:

  • 通过使用异步 IO,您将获得一个完全不使用线程的更具可扩展性的解决方案。
猜你喜欢
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2017-02-12
相关资源
最近更新 更多