public void CleanDisconnect()
        {
            try
            {
                Monitor.TryEnter(this.TcpClientList, 1000);
                var       list   = new List <TcpClient>();
                TcpClient client = null;
                while (!this.TcpClientList.IsEmpty)
                {
                    if (!this.TcpClientList.TryDequeue(out client))
                    {
                        break;
                    }
                    if (client.Client != null && client.Connected)
                    {
                        list.Add(client);
                    }
                    else
                    {
                        CtkNetUtil.DisposeTcpClient(client);
                    }
                }

                foreach (var tc in list)
                {
                    this.m_tcpClientList.Enqueue(tc);
                }
            }
            catch (Exception ex) { CtkLog.Write(ex); }
            finally { Monitor.Exit(this.TcpClientList); }
        }
        public void CleanUntilLast()
        {
            var sourceList = this.m_tcpClientList;

            try
            {
                Monitor.TryEnter(sourceList, 1000);
                var       list   = new List <TcpClient>();
                TcpClient client = null;


                while (!sourceList.IsEmpty)
                {
                    if (!sourceList.TryDequeue(out client))
                    {
                        break;
                    }
                    if (sourceList.IsEmpty)
                    {
                        list.Add(client);
                    }
                    else
                    {
                        CtkNetUtil.DisposeTcpClient(client);
                    }
                }

                foreach (var tc in list)
                {
                    sourceList.Enqueue(tc);
                }
            }
            catch (Exception ex) { CtkLog.Write(ex); }
            finally { Monitor.Exit(sourceList); }
        }
        public void Disconnect()
        {
            if (this.threadNonStopConnect != null)
            {
                this.threadNonStopConnect.Abort();
                this.threadNonStopConnect = null;
            }
            CtkNetUtil.DisposeTcpClient(this.activeWorkClient);

            //一旦結束就死了, 需要重new, 所以清掉event沒問題
            CtkEventUtil.RemoveEventHandlersFromOwningByFilter(this, (dlgt) => true);
        }