void ReceiveAsync(byte[] buffer, EventHandler<SocketAsyncEventArgs> releaseEvent)
{
var asyncEventArgs = AsyncEventArgsPool.Get();
asyncEventArgs.SetBuffer(buffer, 0, buffer.Length);
asyncEventArgs.Completed += releaseEvent;
bool isAsync;
try
{
asyncEventArgs.RemoteEndPoint = socket.RemoteEndPoint;
isAsync = socket.ReceiveAsync(asyncEventArgs); // если данные уже есть в принимаемом буфере
}
catch (Exception ex)
{
AsyncEventArgsPool.Release(asyncEventArgs, releaseEvent);
CloseConnect(ex);
return;
}
if (!isAsync)
{
// Данные были в буффере, обрабатываем сразу. (Тут мы еще в отдельном потоке)
releaseEvent(this, asyncEventArgs);
}
}
и пример асунхронного обработчика
void OnRecieveDataSizeComplete(object sender, SocketAsyncEventArgs asyncEventArgs)
{
if (asyncEventArgs.SocketError != SocketError.Success)
{
var socketError = asyncEventArgs.SocketError;
AsyncEventArgsPool.Release(asyncEventArgs, OnRecieveDataSizeComplete);
CloseConnectOnException(nameof(OnRecieveDataSizeComplete), socketError.ToString());
return;
}
var buffer = asyncEventArgs.Buffer; // Пришел буфер с данными
var bytesRead = asyncEventArgs.BytesTransferred; // Сколько было в него записано
AsyncEventArgsPool.Release(asyncEventArgs, OnRecieveDataSizeComplete);
if (bytesRead == 0)
{
CloseConnectOnEmpty();
return;
}
var messageSize = BitConverter.ToUInt32(buffer, 0); // Тут я просто получаю сообщение в виде размера остальной части сообщения
ReceiveData(messageSize); // Тут запуск на получение новой порции данных. У меня это само тело сообщения
}