private static void FinishReceive(AsyncIOState data)
{
try
{
var transferred = (int) data.Transferred;
if (transferred == 0)
{
data.Callback(false, 0, data.State);
TransferCache.Enqueue(data);
}
else
{
data.PeerMonitor?.BytesReceived(transferred, data.TransferType);
data.ManagerMonitor?.BytesReceived(transferred, data.TransferType);
data.Offset += transferred;
data.Remaining -= transferred;
if (data.Remaining == 0)
{
data.Callback(true, data.Count, data.State);
TransferCache.Enqueue(data);
}
else
{
lock (ReceiveQueue)
ReceiveOrEnqueue(data);
}
}
}
catch
{
data.Callback(false, 0, data.State);
TransferCache.Enqueue(data);
}
}