public void TrySend(SocketAsyncEventArgs args)
        {
            if (!m_Sending.TryEnter())
            {
                return;
            }
            if (args.GetSendContextData().IsEmpty)
            {
                m_Sending.TryExit();
                return;
            }

            try
            {
                bool willRaiseEventLater;
                while (!(willRaiseEventLater = SendAsync(args)))
                {
                    var canSendAvailableBufferList = CompleteSend(args);
                    if (!canSendAvailableBufferList)
                    {
                        m_Sending.TryExit();
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                CloseSocketWhileSending(args, e);
            }
        }