void Received(object o) { System.Threading.Interlocked.Increment(ref countReceived); int j = (int)o; Aio aio = receivers[j]; Errno errno = aio.Result(); if (errno != 0) { return; } Msg msg = aio.GetMsg(); sockets[j].Receive(receivers[j]); uint receivedValue2; msg.ChopU32(out receivedValue2); int receivedValue = (int)receivedValue2; bool valueHasChanged = false; for (;;) { int oldValue = potentials[j]; if (receivedValue + 1 < oldValue) { int beforeExchange = System.Threading.Interlocked.CompareExchange(ref potentials[j], receivedValue + 1, oldValue); if (beforeExchange == oldValue) { valueHasChanged = true; break; } } else { break; } } if (valueHasChanged) { msg.Clear(); msg.AppendU32((uint)potentials[j]); //sockets[j].Send(msg); lock (senders[j]) { senders[j].Wait(); senders[j].SetMsg(msg); sockets[j].Send(senders[j]); } } else { msg.Dispose(); } }