示例#1
0
    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.
    }
示例#3
0
    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.
    }
示例#4
0
        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);
            }
        }