private async Task Run(CancellationToken token)
        {
            _logger?.LogTrace($"{nameof(ConnectionManager)}.{nameof(Run)} port:{_port}, event: {_registerEvent}, uuid: {_uuid}");

            await _proxy.ConnectAsync(new Uri($"ws://localhost:{_port}"), token);

            _logger?.LogTrace($"{nameof(ConnectionManager)}.{nameof(Run)} Connected");
            await _proxy.Register(_registerEvent, _uuid);

            _logger?.LogTrace($"{nameof(ConnectionManager)}.{nameof(Run)} Registered");

            var keepRunning = true;

            while (!token.IsCancellationRequested && keepRunning)
            {
                // Exit loop if the socket is closed or aborted
                switch (_proxy.State)
                {
                case WebSocketState.CloseReceived:
                case WebSocketState.Closed:
                case WebSocketState.Aborted:
                    keepRunning = false;

                    break;
                }

                if (!keepRunning)
                {
                    break;
                }

                var messageTask = ReceiveMessageAsync(token);

                while (!messageTask.IsCompleted)
                {
                    _ActionController.Run(token);
                    await Task.Delay(_ActionController.Timing);
                }

                if (messageTask.Result == TaskStatus.RanToCompletion)
                {
                    if (_lastMessage.Value == null)
                    {
                        _ActionController.OnGlobalEvent(_lastMessage.Key);
                    }
                    else
                    {
                        await _EventDictionary[_lastMessage.Key.Event]?.Invoke(_lastMessage.Value, _lastMessage.Key);
                    }
                }

                messageTask.Dispose();
            }

            Dispose();
        }