示例#1
0
        private void ProcessPendingActions()
        {
            Incoming xPendingRead = mIncompletePendingRead;

            if (xPendingRead != null || mPendingReads.TryTake(out xPendingRead, 5))
            {
                var xNrOfBytesToRead = xPendingRead.Packet.Length - xPendingRead.CurrentPos;
                var xBytesRead       = TryRead(xPendingRead.Packet, xPendingRead.CurrentPos, xNrOfBytesToRead, 5);

                xPendingRead.CurrentPos += xBytesRead;

                if (xPendingRead.CurrentPos == xPendingRead.Packet.Length)
                {
                    // Full packet received, process it
                    xPendingRead.Completed(xPendingRead.Packet);
                    mIncompletePendingRead = null;
                }
                else
                {
                    mIncompletePendingRead = xPendingRead;
                }
            }

            //process_writes:

            // now process sends.
            Outgoing xPendingWrite;

            if (mPendingWrites.TryTake(out xPendingWrite, 5))
            {
                if (!SendRawData(xPendingWrite.Packet))
                {
                    throw new Exception("SendRawData returned false!");
                }
                if (xPendingWrite.Completed != null)
                {
                    xPendingWrite.Completed.Set();
                }
            }
        }