什么是命名管道 (net.pipe) 限制?
Posted
技术标签:
【中文标题】什么是命名管道 (net.pipe) 限制?【英文标题】:What are named pipes (net.pipe) limitations? 【发布时间】: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 个线程?为什么你认为这是多个管道的问题?您是否认为这可能是线程数问题? 【参考方案1】:您是否排除了竞争条件,即客户端试图连接到服务器尚未建立的管道?如果服务器上有很多活动线程,则很容易延迟应该开始侦听的线程。这可以解释为什么它在一开始就有效。
一般来说,每个客户端都有一个服务器线程并不能很好地扩展;使用线程池方法可以获得更好的性能。
【讨论】:
通过使用异步 IO,您将获得一个完全不使用线程的更具可扩展性的解决方案。以上是关于什么是命名管道 (net.pipe) 限制?的主要内容,如果未能解决你的问题,请参考以下文章
使用 App.Config 在 Windows 服务中的 WCF 命名管道