NetworkStream Pooling

У меня есть многопоточное приложение, которое связывается с сервером через TCP-соединение. Приложение будет развернуто как служба Windows.

То, как это было реализовано, есть, есть Controller который создает Communicator объекты, назначает номер порта, количество сообщений и т. д. Communicator и вызывает его StartClient способ начать диалог с сервером.

В пределах StartClient метод, каждый Communicator Объект создает соединение с сервером, используя номер порта и URL, указанный в Controller, После установления соединения он внутренне создает поток и вызывает ReadMessages метод, который продолжает чтение с сервера до тех пор, пока счетчик сообщений не будет встречен, а затем закрыт.

В зависимости от условий выполнения может потребоваться повторное использование Communicator объект, чтобы снова поговорить с сервером и, следовательно, ReadMessages метод будет вызван снова.

Первоначально мы звонили Dispose() метод для объектов NetworkStream, StreamReader и StreamWriter, когда ReadMessages метод завершен, но в сценарии переподключения он выдает ошибку "Не удается получить доступ к удаленному объекту". Итак, мы закомментировали Dispose вызов метода для тестирования.

На данный момент он работает нормально, но я обеспокоен тем, что это не лучший способ достичь этой функциональности, поскольку я никогда не избавляюсь от объектов.

Я думал с точки зрения объектного пула: возможно ли иметь пул потоковых объектов, которые могут быть повторно использованы различными потоками?

Одним из способов решения этой проблемы может быть создание нового экземпляра объектов Stream каждый раз, когда Communicator соединяется с сервером, но я думаю, что это будет дорогой операцией.

Не могли бы вы помочь мне определить лучший подход к урегулированию ситуации здесь, чтобы я мог повторно использовать Communicator объект без удара производительности?

1 ответ

Решение

Подход будет основан на том, как часто вам нужно читать сообщения - если это время от времени, я бы порекомендовал вам перефакторизовать ваш объект коммуникатора, чтобы сделать операцию "ReadMessages" атомарной - то есть она будет подключаться к серверу, создавать сетевой поток, читать сообщения, а затем распоряжаться каждой вещи.

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