BeginSend <IList <ArraySegment ....) выполняет атомарную отправку всех ArraySegment? - PullRequest
6 голосов
/ 04 июля 2011

Класс Socket в .NET предоставляет следующий метод:

Socket.BeginSend Method (IList<ArraySegment<Byte>>, SocketFlags, AsyncCallback, Object)

У меня есть класс BufferManager, который возвращает ArraySegment<byte> указанного постоянного размера 2 КБ.Теперь у меня есть сообщение для отправки, скажем, оно имеет размер 10 КБ, поэтому я могу использовать 5 предварительно выделенных буферов для хранения этого сообщения и вызвать Socket.BeginSend(IList<ArraySegment>>...).Будет ли это сообщение отправлено атомарно, как если бы я просто использовал просто byte[] (т. Е. Несколько параллельных операций BeginSend не смешивали бы сообщения на удаленном сайте)?

Редактировать: уточнить - яЯ использую сокет TCP / IP и моя программа вызывает BeginSend из нескольких потоков одновременно.Допустим, у нас есть два списка сегментов массива:
L1: a1 a2 a3
L2: b1 b2 b3
Теперь я вызываю BeginSend (L1 ...) и BeginSend (L2 ...) из двух потоковв то же время.Я хочу знать, не смешаются ли эти два списка на удаленной стороне, и я не буду читать что-то вроде: a1 b1 b2 a2 b3 a3.

1 Ответ

1 голос
/ 06 июля 2011

Все, что делает BufferManager - это поддерживает набор фиксированных блоков памяти, которые вы можете использовать.BufferManager не влияет ни на параллелизм байтов, ни на то, как они используются в любом случае.Из документации MSDN:

Вы можете использовать класс BufferManager для управления буферным пулом.Пул и его буферы создаются при создании экземпляра этого класса и уничтожаются, когда пул буферов освобождается при сборке мусора.Каждый раз, когда вам нужно использовать буфер, вы берете его из пула, используете его и возвращаете в пул, когда закончите.Этот процесс намного быстрее, чем создание и уничтожение буфера каждый раз, когда вам нужно его использовать.

BufferManager - это просто удобный способ избежать вызовов new [] и затем ждать, пока GC не уничтожитблоки.Когда вы закончите отправку этих блоков, убедитесь, что вы вызываете BlockManager.ReturnBuffer, иначе эти байты будут недоступны для будущих сообщений и будут задерживаться до тех пор, пока ваш BufferManager сам не будет GC'd.Если он будет работать вместе с BufferManager, и вы отправляете много сообщений с использованием этих буферов, вы, вероятно, потеряете огромное количество памяти.

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