Объединение сетевых потоков

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

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

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

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

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

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

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

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

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


person Danish Khan    schedule 21.12.2010    source источник
comment
Как вы думаете, какой выигрыш в производительности вы получите, повторно используя объекты Communicator?   -  person jgauffin    schedule 21.12.2010
comment
@jgauffin дело не только в производительности. Существует несколько маркеров, которые коммуникатор использует для проверки запросов, и маркеры назначаются контроллером при создании экземпляров этих объектов. Нам нужно повторно использовать, чтобы не повредить ассоциацию токенов.   -  person Danish Khan    schedule 21.12.2010


Ответы (1)


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

person VinayC    schedule 21.12.2010
comment
спасибо @VinayC, но операция чтения является основной задачей и выполняется постоянно. Вот почему я думал, что повторное создание новых объектов каждый раз было бы довольно дорого. - person Danish Khan; 21.12.2010
comment
@Danish, судя по вашему описанию, это происходит частями (частью будет определенное количество сообщений), поэтому мое предложение основано на том, как часто читается часть. Например, предположим, что накладные расходы на переподключение составляют 5 секунд, а фрагмент считывается в среднем за 5 минут, тогда имеет смысл переподключиться. - person VinayC; 21.12.2010
comment
Ну, если бы это был один поток, я бы все равно счел это нормальным, но подумайте о нескольких потоках, работающих параллельно. Будете ли вы по-прежнему чувствовать, что каждый поток создает новые экземпляры каждые 5 минут или около того, было бы хорошей идеей? - person Danish Khan; 21.12.2010
comment
Конечно, мне пришлось бы это сделать, если бы не было другого курорта, но действительно ли это единственный вариант? - person Danish Khan; 21.12.2010