Каковы ограничения именованных каналов (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 ответ

Решение

Исключили ли вы состояние гонки, когда клиент пытается подключиться к каналу, который еще не установлен сервером? Если на сервере много активных потоков, он может легко задержать поток, который должен начать прослушивание. Это может объяснить, почему это работает в начале.

В общем, наличие серверного потока для каждого клиента не очень хорошо масштабируется; Вы получите лучшую производительность с подходом пула потоков.

Другие вопросы по тегам