private void _receiveComplete(IAsyncResult result)
{
if (result.CompletedSynchronously)
return;
bool received = false;
IPEndPoint ep = null;
int length = 0;
byte[] buffer = (byte[])result.AsyncState;
Queue<IAsyncResult> queue = null;
while (result != null)
{
received = false;
lock(_lock)
{
if (_socket != null)
{
try
{
// complete this receive operation
length = _socket.EndReceiveFrom(result, ref _remoteEP);
ep = (IPEndPoint)_remoteEP;
// queue the next receive operation
IAsyncResult tempResult = _receiveNext();
if (tempResult.CompletedSynchronously)
{
if (queue == null)
queue = new Queue<IAsyncResult>();
queue.Enqueue(tempResult);
}
received = true;
}
catch (SocketException)
{
_disposeAll();
break;
}
}
}
if (received)
{
_receiveDelegate(ep, buffer, length);
}
result = (queue == null || queue.Count == 0) ? null : queue.Dequeue();
}
}