public bool Decrement() { while (true) { var v = _value; if (v < 2) throw new InvalidOperationException("Already Zero"); var vNew = v - 2; if (Interlocked.CompareExchange(ref _value, vNew, v) == v) return vNew == 1; } }
private void OnReceiveComplete(object sender, SocketAsyncEventArgs args) { // 비동기 완료 및 재진입 처리 if (args.SocketError != SocketError.Success) { HandleSocketError(args.SocketError); return; } var len = args.BytesTransferred; if (len == 0) { HandleSocketError(SocketError.Shutdown); return; } // Deserialize packet if (_receiveLargeBuffer == null) { if (TryDeserializeNormalPacket(len) == false) { return; } } else { if (TryDeserializeLargePacket(len) == false) { return; } } if (_issueCountFlag.Decrement()) { ProcessClose(); return; } IssueReceive(); }