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(); }