public Session(IStreamHandler streamHandler, Socket socket, Guid sessionId) { SessionId = sessionId; Socket = socket; StreamHandler = streamHandler; _outgoingBuffer = new BytesRingBuffer(64 * 1024); _receiveEventArgs = new SocketAsyncEventArgs { UserToken = this }; _sendEventArgs = new SocketAsyncEventArgs { UserToken = this, RemoteEndPoint = socket.RemoteEndPoint }; _sendObservable = _sendEventArgs.ToObservable(); _sendSubscription = _sendObservable.SubscribeOn(ThreadPoolScheduler.Instance).Subscribe(OnSendCompleted); IObservable<byte[]> dataToSend = Observable.FromEventPattern<byte[]>(this, "OnSendAsync").Select(pattern => pattern.EventArgs); dataToSend.Subscribe(data => { if (_outgoingBuffer.FreeBytes >= data.Length) { WriteToSendBuffer(data); } else { _outgoingBuffer.NotifyFreeSpace(data.Length, _freeSpaceHandler); if (!_freeSpaceHandler.WaitOne(5000) && _outgoingBuffer.FreeBytes < data.Length) { //Slow consumer Trace.TraceError("Slow consumer detected. Closing Socket to {0}.", Socket.RemoteEndPoint); Close(); } else { WriteToSendBuffer(data); } } }); }