/// <summary> /// Disconnects from the server. The server is actively notified about disconnection. /// </summary> public void Disconnect() { if (_channel != null && HasSession) { if (_keepSessionAliveTimer != null) { _keepSessionAliveTimer.Stop(); _keepSessionAliveTimer.Dispose(); _keepSessionAliveTimer = null; } byte[] sharedSecret = MessageEncryption ? _sessionId.ToByteArray() : null; var goodbyeMessage = new GoodbyeMessage() { SessionId = _sessionId }; var wireMessage = MessageEncryptionManager.CreateWireMessage( messageType: "goodbye", serializer: Serializer, serializedMessage: Serializer.Serialize(goodbyeMessage), keyPair: _keyPair, sharedSecret: sharedSecret); byte[] rawData = Serializer.Serialize(wireMessage); _goodbyeCompletedWaitHandle.Reset(); _channel.RawMessageTransport.SendMessage(rawData); _goodbyeCompletedWaitHandle.Wait(10000); } _channel?.Disconnect(); _handshakeCompletedWaitHandle?.Reset(); _authenticationCompletedWaitHandle?.Reset(); Identity = null; }