2012-01-17 1 views
1

У меня есть tcpclient, который подключается к бэкэнд-системе, отправляя запросы xml и получая ответы xml.Как повторно использовать TcpClients в режиме синхронной блокировки?

Бэкэнд требует, чтобы клиент выполнил вход в систему и установил некоторые параметры среды перед тем, как будет выполнено какое-либо запрос. Это дорогостоящая операция, поэтому имеет смысл создать tcpclient и сохранить его для повторных запросов.

Бэкэнд, который, как мне сказали, оптимизирован для обработки многих соединений и по соображениям производительности, я хотел бы иметь многочисленные подключения tcpclients.

Запросы в форме списка, который содержит тысячи единиц.

Мой вопрос в том, как лучше создать группу подключаемых tcpclients, которые можно использовать повторно, поэтому я могу выполнить несколько одновременных запросов из списка (например, по 10 за раз), какой шаблон подходит для этого сценария, и есть ли какие-либо примеры, которые я могу научиться лучшей практике?

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

QueryService service = new QueryService(server, port, user, pass, params, app); 

foreach(var item in queries) 
{ 
    service.ExecuteRequest(item); 
} 

service.Disconnect(); 
+0

Вы пытались использовать метод async для клиента tcp в параллельном цикле foreach? –

+0

Как упоминалось в заголовке, tcpclient находится в режиме синхронной блокировки. Каждый запрос должен отправить конечную последовательность до того, как бэкэнд отправит ответ. Я не уверен, могу ли я сделать aync, чтобы читать и записывать в базовые сокеты? –

ответ

1

Что вам нужно, это thread pool или Object pool узор. В принципе, вы можете создать пул из Service объектов, а затем, когда любой элемент (функция или объект) клиентского приложения должен получить доступ к службе - он может просто ссылаться на объект службы на основе некоторых критериев.

Чтобы сделать это успешным, у вас должен быть запрос state-less, чтобы при выборе произвольного объекта службы для запроса на какой-либо сервер - история не должна создавать проблемы.

+0

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

+0

Я реализовал шаблон пула объектов, и он работает с удовольствием, большое спасибо для указателя. –