示例#1
0
        public void Dispose()
        {
            if (IsConnected)
            {
                Close();
            }

            if (tcpReader != null)
            {
                tcpReader.Dispose();
                tcpReader = null;
            }

            if (tcpClient != null)
            {
                tcpClient.Close();
                tcpClient = null;
            }

            if (EventDispatcher != null)
            {
                EventDispatcher.Dispose();
                EventDispatcher = null;
            }
        }
示例#2
0
        private void DisconnectInternal(bool manualLock = false, bool triggerEvent = true)
        {
            if (wasExit)
            {
                return;
            }

            if (!manualLock)
            {
                Monitor.Enter(StatusLock);
            }

            try
            {
                switch (Status)
                {
                case Ts3ClientStatus.Disconnected:
                    if (!wasExit)
                    {
                        wasExit = true;
                        packetHandler.Stop();
                        msgProc.DropQueue();
                        dispatcher.Dispose();
                        if (triggerEvent)
                        {
                            OnDisconnected?.Invoke(this, new DisconnectEventArgs(packetHandler.ExitReason ?? MoveReason.LeftServer));
                        }
                    }
                    break;

                case Ts3ClientStatus.Disconnecting:
                    break;

                case Ts3ClientStatus.Connected:
                    ClientDisconnect(MoveReason.LeftServer, QuitMessage);
                    Status = Ts3ClientStatus.Disconnecting;
                    break;

                case Ts3ClientStatus.Connecting:
                    break;

                default:
                    break;
                }
            }
            finally
            {
                if (!manualLock)
                {
                    Monitor.Exit(StatusLock);
                }
            }
        }
示例#3
0
 public override void Dispose()
 {
     lock (sendQueueLock)
     {
         tcpWriter?.Dispose();
         tcpWriter = null;
         tcpReader?.Dispose();
         tcpReader = null;
         msgProc.DropQueue();
         dispatcher.Dispose();
     }
 }
示例#4
0
        private void DisconnectInternal(ConnectionContext ctx, CommandError error = null, TsClientStatus?setStatus = null)
        {
            bool triggerEventSafe = false;

            lock (statusLock)
            {
                Log.Debug("DisconnectInternal wasExit:{0} error:{1} oldStatus:{2} newStatus:{3}", ctx.WasExit, error?.ErrorFormat(), status, setStatus);

                if (setStatus.HasValue)
                {
                    status = setStatus.Value;
                }

                if (ctx.WasExit)
                {
                    return;
                }

                switch (status)
                {
                case TsClientStatus.Connecting:
                case TsClientStatus.Disconnected:
                    ctx.WasExit = true;
                    packetHandler.Stop();
                    msgProc.DropQueue();
                    dispatcher.Dispose();
                    dispatcher       = null;
                    triggerEventSafe = true;
                    break;

                case TsClientStatus.Disconnecting:
                    break;

                case TsClientStatus.Connected:
                    ClientDisconnect(Reason.LeftServer, QuitMessage);
                    status = TsClientStatus.Disconnecting;
                    break;

                default:
                    throw Tools.UnhandledDefault(status);
                }
            }

            if (triggerEventSafe)
            {
                OnDisconnected?.Invoke(this, new DisconnectEventArgs(ctx.ExitReason ?? Reason.LeftServer, error));
            }
        }
示例#5
0
        private void DisconnectInternal(ConnectionContext ctx, bool triggerEvent = true)
        {
            bool triggerEventSafe = false;

            lock (statusLock)
            {
                if (ctx.WasExit)
                {
                    return;
                }

                switch (status)
                {
                case Ts3ClientStatus.Disconnected:
                    ctx.WasExit = true;
                    packetHandler.Stop();
                    msgProc.DropQueue();
                    dispatcher.Dispose();
                    triggerEventSafe = triggerEvent;
                    break;

                case Ts3ClientStatus.Disconnecting:
                    break;

                case Ts3ClientStatus.Connected:
                    ClientDisconnect(MoveReason.LeftServer, QuitMessage);
                    status = Ts3ClientStatus.Disconnecting;
                    break;

                case Ts3ClientStatus.Connecting:
                    break;

                default:
                    throw Util.UnhandledDefault(status);
                }
            }

            if (triggerEventSafe)
            {
                OnDisconnected?.Invoke(this, new DisconnectEventArgs(packetHandler.ExitReason ?? MoveReason.LeftServer));
            }
        }
示例#6
0
 /// <summary>Release all resources. Will try to disconnect before disposing.</summary>
 public override void Dispose()
 {
     Disconnect();
     dispatcher?.Dispose();
 }