2012-09-13 44 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,您將獲得更加可擴展的解決方案,而不需要任何線程。 –