private bool ReuseHeartBeatSAEA(List <Message> messages, string serverEndPointKey)
        {
            try {
                if (!dictPoolOfHeartBeatRecSendEventArgs.ContainsKey(serverEndPointKey))
                {
                    return(false);
                }

                SocketAsyncEventArgPool thisPortSocketPool = dictPoolOfHeartBeatRecSendEventArgs[serverEndPointKey];

                //while (!thisPortSocketPool.IsEmpty)
                while (true)
                {
                    cleanSignal.Reset();

                    //鉴于IsEmpty有问题,确保有Pop尝试!
                    SocketAsyncEventArgs arg = thisPortSocketPool.Pop();

                    if (arg == null)
                    {
                        if (thisPortSocketPool.IsEmpty)
                        {
                            LogManager.LogTraceInfo(string.Format("poolKey:{0} 's pool empty now with count:{1}", serverEndPointKey, thisPortSocketPool.Count));
                            return(false);
                        }
                        else
                        {
                            Thread.Sleep(1);
                            continue;
                        }
                    }

                    GetSimplePerf().PerfClientReuseConnectionCounter.Increment();
                    GetSimplePerf().PerfClientIdleConnectionCounter.Decrement();

                    ClientUserToken userToken = (ClientUserToken)arg.UserToken;
                    userToken.CreateNewSendDataHolder();
                    SendDataHolder sendDataHodler = userToken.sendDataHolder;

                    sendDataHodler.SetSendMessage(messages);
                    MessagePreparer.GetDataToSend(arg);
                    sendDataHodler.ArrayOfMessageToSend[0].StartTime = DateTime.Now;

                    StartSend(arg);

                    return(true);
                }
            }
            catch (Exception pickErr) {
                LogManager.Log(string.Format("pick socket from poolKey:{0} occur error!", serverEndPointKey), pickErr);
            }
            finally {
                cleanSignal.Set();
            }

            return(false);
        }
        private void ProcessConnect(SocketAsyncEventArgs connectEventArgs)
        {
            ConnectOpUserToken theConnectingToken = (ConnectOpUserToken)connectEventArgs.UserToken;

            if (connectEventArgs.SocketError == SocketError.Success)
            {
                SocketAsyncEventArgs receiveSendEventArgs = poolOfRecSendEventArgs.Pop();

                if (receiveSendEventArgs == null)
                {
                    //几乎不可能发生!
                    LogManager.Log(string.Empty, new Exception("fetch receiveSendEventArgs failed for connect"));
                    return;
                }

                Interlocked.Increment(ref currentConnectionCount);
                GetSimplePerf().PerfConcurrentClientConnectionCounter.Increment();

                receiveSendEventArgs.AcceptSocket = connectEventArgs.AcceptSocket;

                ClientUserToken receiveSendToken = (ClientUserToken)receiveSendEventArgs.UserToken;

                receiveSendToken.sendDataHolder.SetSendMessage(theConnectingToken.ArrayOfMessageReadyToSend);
                receiveSendToken.ServerEndPointKey = theConnectingToken.ServerEndPointKey;

                MessagePreparer.GetDataToSend(receiveSendEventArgs);

                receiveSendToken.startTime = theConnectingToken.ArrayOfMessageReadyToSend[0].StartTime;

                StartSend(receiveSendEventArgs);

                //release connectEventArgs object back to the pool.
                connectEventArgs.AcceptSocket = null;
                this.poolOfConnectEventArgs.Push(connectEventArgs);
            }
            else
            {
                ProcessConnectionError(connectEventArgs);
            }
        }
        private void RunHeartBeat()
        {
            int  waitTime       = 180000;
            bool alreadyChecked = false;

            while (true)
            {
                if (alreadyChecked)
                {
                    if (!DateTime.Now.Hour.Equals(3))
                    {
                        alreadyChecked = false;
                    }

                    Thread.Sleep(waitTime);
                }

                if (DateTime.Now.Equals(3))
                {
                    foreach (string poolKey in dictPoolOfHeartBeatRecSendEventArgs.Keys)
                    {
                        SocketAsyncEventArgPool thisPortKey = dictPoolOfHeartBeatRecSendEventArgs[poolKey];

                        if (thisPortKey.IsEmpty)
                        {
                            continue;
                        }

                        Stopwatch sw = new Stopwatch();

                        sw.Start();
                        bool existNeedReuseItem = false;

                        cleanSignal.WaitOne();

                        SocketAsyncEventArgs        heartBeatSAEA = thisPortKey.Pop();
                        List <SocketAsyncEventArgs> listRepush    = new List <SocketAsyncEventArgs>();

                        while (!thisPortKey.IsEmpty)
                        {
                            if (heartBeatSAEA != null)
                            {
                                ClientUserToken userToken = (ClientUserToken)heartBeatSAEA.UserToken;

                                if (DateTime.Now.Subtract(userToken.startTime).TotalSeconds < 120)
                                {
                                    listRepush.Add(heartBeatSAEA);
                                    existNeedReuseItem = true;
                                }
                                else
                                {
                                    //说明太闲了(完全空闲两分钟了!一直没被Pop出去复用),不用发所谓心跳,直接关闭
                                    StartDisconnect(heartBeatSAEA);
                                    GetSimplePerf().PerfClientIdleConnectionCounter.Decrement();
                                }
                            }

                            if (existNeedReuseItem)
                            {
                                //别因为等待信号,导致可复用连接长时间无效闲置
                                if (sw.ElapsedMilliseconds > 100)
                                {
                                    break;
                                }
                            }

                            cleanSignal.WaitOne();
                            heartBeatSAEA = thisPortKey.Pop();
                        }

                        for (int i = 0; i < listRepush.Count; i++)
                        {
                            thisPortKey.Push(listRepush[i]);
                        }

                        //if (listRepush.Count > 1)
                        //    thisPortKey.BatchPush(listRepush.ToArray());
                        //else if (listRepush.Count.Equals(1))
                        //    thisPortKey.Push(listRepush[0]);
                    }

                    alreadyChecked = true;
                }

                Thread.Sleep(waitTime);
            }
        }