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