private void HandleWriteCompleted(SocketError error, int bytesTransferred) { // error checks etc removed for this sample. if (_currentJob.WriteCompleted(bytesTransferred)) { _currentJob.Dispose(); bool spin = true; while (spin) { switch (_state) { case State.Active: if (Interlocked.CompareExchange(ref _state, State.Dequeue, State.Active) == State.Active) { if (!_writeQueue.TryDequeue(out _currentJob)) { // handle in state _currentJob = null; _state = State.Idle; return; } else { _state = State.Active; } } // else consider new state break; case State.Enqueue: // spin to wait for new state Thread.Yield(); break; // impossible states case State.Idle: case State.Dequeue: break; } } } _logger.Debug(_writeArgs.GetHashCode() + ": writing more "); _currentJob.Write(_writeArgs); // the job is invoked asycnhronously here. }
private void HandleWriteCompleted(SocketError error, int bytesTransferred) { // error checks etc removed for this sample. if (_currentJob.WriteCompleted(bytesTransferred)) { _currentJob.Dispose(); _currentJob = null; // maybe some barrier is needed here?... if (!_writeQueue.TryDequeue(out _currentJob)) { return; } } _logger.Debug(_writeArgs.GetHashCode() + ": writing more "); _currentJob.Write(_writeArgs); // the job is invoked asycnhronously here. }
private void HandleWriteCompleted(SocketError error, int bytesTransferred) { // error checks etc removed for this sample. if (_currentJob.WriteCompleted(bytesTransferred)) { _currentJob.Dispose(); Interlocked.Exchange(ref _currentJob, null); if (!_writeQueue.TryDequeue(out _currentJob)) { return; } } _logger.Debug(_writeArgs.GetHashCode() + ": writing more "); _currentJob.Write(_writeArgs); // the job is invoked asycnhronously here. }
private void HandleWriteCompleted(SocketError error, int bytesTransferred) { if (_currentJob == null || _socket == null || !_socket.Connected) { return; // got disconnected } if (error == SocketError.Success && bytesTransferred > 0) { lock (this) { if (_currentJob.WriteCompleted(bytesTransferred)) { _currentJob.Dispose(); if (!_writeQueue.TryDequeue(out _currentJob)) { _logger.Debug(_writeArgs.GetHashCode() + ": no new job "); _currentJob = null; return; } } } _currentJob.Write(_writeArgs); var isPending = _socket.SendAsync(_writeArgs); if (!isPending) { HandleWriteCompleted(_writeArgs.SocketError, _writeArgs.BytesTransferred); } } else { if (error == SocketError.Success) { error = SocketError.ConnectionReset; } HandleDisconnect(error); } }