예제 #1
0
        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;
            }
        }
예제 #2
0
        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();
 }