예제 #1
0
        /// <summary>
        /// Starts the session receiving loop. This exits when closed explicitly or by remote end point.
        /// </summary>
        public void Loop()
        {
            if (IsClosing || IsDisposing)
            {
                return;
            }
            var token = Cancellation.Token;

            WorkerThreadId = Thread.CurrentThread.ManagedThreadId;
            IsActive       = true;
            if (Owner.IsServer)
            {
                Owner.IsListening = true;
            }
            else
            {
                Owner.IsConnected = true;
            }
            while (!token.IsCancellationRequested && Stream.WaitDataAvailable(token))
            {
                try {
                    var received = Transceiver.Receive(Stream);
                    if (token.IsCancellationRequested)
                    {
                        break;
                    }
                    switch (received.Key)
                    {
                    case ReceiveStatus.Over: continue;

                    case ReceiveStatus.OverAndOut:
                        Message = received.Value;
                        MessageReceived?.Invoke(this, EventArgs.Empty);
                        if (((object)Message is X690.Message m) && m.IsEndSession)
                        {
                            break;
                        }
                        continue;
                    }
                    break;
                }
                catch (Exception x) {
                    var source = $"{GetType().Name}.{MethodBase.GetCurrentMethod().Name}";
                    if (String.IsNullOrEmpty(x.Source))
                    {
                        x.Source = source;
                    }
                    else
                    {
                        x.Source += $"; {source}";
                    }
                    ExceptionThrown?.Invoke(this, new ExceptionEventArgs(x));
                    break;
                }
            }
            IsActive = false;
            End?.Invoke(this, EventArgs.Empty);
        }