/// <summary> /// CAUTION: YOU MUST <see langword="await"/> <see cref="_InitTask"/> BEFORE USING THIS OBJECT! /// </summary> /// <param name="device"></param> /// <param name="connectResponse"></param> /// <param name="cryptoContext"></param> private SmartGlassClient( Device device, ConnectResponseMessage connectResponse, CryptoContext cryptoContext) { _messageTransport = new MessageTransport(device.Address.ToString(), cryptoContext); _sessionMessageTransport = new SessionMessageTransport( _messageTransport, new SessionInfo() { ParticipantId = connectResponse.ParticipantId }); _sessionMessageTransport.ProtocolTimeoutOccured += (_, e) => ProtocolTimeoutOccured?.Invoke(this, e); _sessionMessageTransport.MessageReceived += (s, e) => { if (e.Message is ConsoleStatusMessage consoleStatusMessage) { CurrentConsoleStatus = new ConsoleStatus() { Configuration = consoleStatusMessage.Configuration, ActiveTitles = consoleStatusMessage.ActiveTitles }; ConsoleStatusChanged?.Invoke(this, new ConsoleStatusChangedEventArgs( CurrentConsoleStatus )); } }; _InitTask = InitializeAsync(); }
public void StartHeartbeat() { Task.Run(async() => { _lastReceived = DateTime.Now; while (!_cancellationTokenSource.IsCancellationRequested) { await SendMessageAckAsync(requestAck: true); await Task.Delay(_heartbeatInterval); if (DateTime.Now - _lastReceived > _heartbeatTimeout) { ProtocolTimeoutOccured?.Invoke(this, new EventArgs()); break; } } }, _cancellationTokenSource.Token); }
public void StartHeartbeat() { Task.Run(() => { while (!_cancellationTokenSource.IsCancellationRequested) { try { SendHeartbeatAsync().GetAwaiter().GetResult(); } catch (TimeoutException) { ProtocolTimeoutOccured?.Invoke(this, new EventArgs()); break; } Task.Delay(TimeSpan.FromSeconds(_heartbeatTimeoutSeconds)) .GetAwaiter().GetResult(); } }, _cancellationTokenSource.Token); }