Каковы ограничения именованных каналов (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+ процессов / итераций он работает нормально, я могу открыть соединение и передать сообщения, но позже появляются ошибки, которые начинают появляться:
Конечная точка не прослушивала net.pipe://localhost/pipea0360/pipea0360, которая могла бы принять сообщение. Это часто вызвано неправильным адресом или действием SOAP. Смотрите InnerException, если присутствует, для более подробной информации.
У меня вопрос, есть ли какие-либо ограничения на количество каналов, которые я могу открыть параллельно?
Это потому, что я открываю так много процессов?
1 ответ
Исключили ли вы состояние гонки, когда клиент пытается подключиться к каналу, который еще не установлен сервером? Если на сервере много активных потоков, он может легко задержать поток, который должен начать прослушивание. Это может объяснить, почему это работает в начале.
В общем, наличие серверного потока для каждого клиента не очень хорошо масштабируется; Вы получите лучшую производительность с подходом пула потоков.