Socket.Recieve Failing при многопоточности - PullRequest
0 голосов
/ 08 апреля 2010

Следующий фрагмент кода работает нормально при распараллеливании на 4-5 потоков, но начинает давать сбой, когда количество потоков увеличивается где-то за пределами 10 одновременных потоков

int totalRecieved = 0;
int recieved;
StringBuilder contentSB = new StringBuilder(4000);
while ((recieved = socket.Receive(buffer, SocketFlags.None)) > 0)
{
   contentSB.Append(Encoding.ASCII.GetString(buffer, 0, recieved));
   totalRecieved += recieved;
}

Метод Recieve возвращается с нулевым прочитанным байтом, и если я продолжу вызывать метод recieve, то в итоге получаю исключение «Установленное соединение было прервано программным обеспечением на вашем хост-компьютере». Поэтому я предполагаю, что хост действительно отправил данные, а затем закрыл соединение, но по какой-то причине я так и не получил его.

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

Редактировать: просто чтобы уточнить. Каждый поток имеет собственный персональный сокет для чтения разных данных.

Ответы [ 2 ]

1 голос
/ 08 апреля 2010

Для открытых соединений установлен системный предел, см. Для начала этот вопрос SO .А вот немного больше информации .

0 голосов
/ 08 апреля 2010

Проблема пытается использовать функцию «Прием по одному и тому же сокету» в нескольких потоках.

В документации MSDN для класса сокетов особенно рекомендуется, чтобы метод сокета Receive использовался только одним потоком в одном потоке во время выполнения.

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

  • Используйте BeginReceive и EndReceive в соответствии с рекомендациями MSDN или

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...