private void TryDequeueReceivedData()
{
Action<ITcpConnection, IEnumerable<ArraySegment<byte>>> callback;
List<ArraySegment<byte>> res = null;
lock (_receivingLock)
{
// no awaiting callback or no data to dequeue
if (_receiveCallback == null || _receiveQueue.Count == 0)
return;
res = new List<ArraySegment<byte>>(_receiveQueue.Count);
while (_receiveQueue.Count > 0)
{
var arraySegments = _receiveQueue.Dequeue();
res.Add(arraySegments);
}
callback = _receiveCallback;
_receiveCallback = null;
}
callback(this, res.ToArray());
uint bytes = 0;
foreach (var tuple in res)
{
bytes += (uint)tuple.Count;
}
NotifyReceiveDispatched(bytes);
}