2012-09-13 151 views
3

我已经在一个循环中运行一个程序,每次迭代运行在不同的线程,我创建新的进程打开新的服务主机:从我的主程序什么是命名管道(net.pipe)限制?

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+ proccess /迭代它工作正常,我可以打开的连接和传递消息,但后来出现的错误,开始出现:

有没有终点在 net.pipe听://本地主机/ pipea0360/pipea0360是可以接受 消息。这通常是由不正确的地址或SOAP操作引起的。 有关更多详细信息,请参阅InnerException(如果存在)。

我的问题是,如果我可以并行打开的管道数量有任何限制吗?
这是因为我开了这么多的proccesses?

+0

您是否按照异常的建议*参见InnerException *?它可以帮助您确定问题的实际原因。也许你可以在你的问题中编辑内部异常的描述。 – MvanGeest

+0

@MvanGeest内部异常相同外一个:没有终点的net.pipe听://本地主机/ pipea0360/pipea0360是可以接受的消息。 –

+0

您正在为每个_host创建一个新线程,以便创建超过200个线程?为什么?我相当确信线程的最佳数量小于200.为什么超过200 _host? – Paparazzi

回答

3

你已经排除了竞争条件,该客户端试图连接到服务器尚未建立管?如果服务器上有很多活动的线程,它可能很容易延迟应该开始监听的线程。这可以解释为什么它在一开始就起作用。

通常,具有为每个客户端不能很好地扩展一个服务器线程;使用线程池方法可以获得更好的性能。

+0

通过使用异步IO,您将获得更加可扩展的解决方案,而不需要任何线程。 –