protected virtual void OnReceived(IMessage message) { idleStateMonitor?.OnReceived(); if (message is TNotification notification) { this.notificationSubject.Publish(notification); return; } if (message is IResponse response) { foreach (var request in promises.Keys) { if (request.Sequence == response.Sequence) { RequestTaskTimeoutOrCompletionSource promise; if (promises.TryRemove(request, out promise) && promise != null) { promise.SetResult(response); } break; } } return; } }
protected virtual async void DoReceived() { while (running) { try { lock (stateLock) { if (!this.Connected) { Monitor.Wait(stateLock); continue; } } IMessage message = await this.channel.ReadAsync(); idleStateMonitor?.OnReceived(); if (message is TNotification) { this.notificationSubject.Publish((TNotification)message); continue; } if (message is TResponse) { TResponse response = (TResponse)message; TaskTimeoutOrCompletionSource <TResponse> promise; if (promises.TryRemove(response.Sequence.ToString(), out promise) && promise != null) { promise.SetResult(response); } continue; } } catch (Exception) { if (this.State == ConnectionState.Connected) { this.eventArgsSubject.Publish(ConnectionEventArgs.ExceptionEventArgs); await DoDisconnect(); if (this.State != ConnectionState.Connected) { return; } if (AutoReconnect) { try { await Reconnect(); } catch (Exception) { } } else { this.State = ConnectionState.Exception; } } } } }
protected virtual void OnReceived(IMessage message) { idleStateMonitor?.OnReceived(); }