public WebSocketSession(WebSocket webSocket, IMessageParser messageParser, ILogger <WebSocketSession> logger) { if (webSocket is null) { throw new ArgumentNullException(nameof(webSocket)); } if (messageParser is null) { throw new ArgumentNullException(nameof(messageParser)); } if (logger is null) { throw new ArgumentNullException(nameof(logger)); } _incomingMessagesProcessor = new Thread(() => { try { var received = new List <byte[]>(4); byte[] buffer = new byte[1024 * 4]; while (!_isDisposed && !webSocket.CloseStatus.HasValue && webSocket.State == WebSocketState.Open) { var result = webSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None) .GetAwaiter() .GetResult(); received.Add(buffer[0..result.Count]); if (result.EndOfMessage) { var messageRaw = Encoding.UTF8.GetString(received.SelectMany(x => x).ToArray()); var message = messageParser.DeserializeClientMessage(messageRaw); if (!_receivedMessagesSubject.IsDisposed) { _receivedMessagesSubject.OnNext(message); } received.Clear(); } Array.Clear(buffer, 0, buffer.Length); }