protected async Task ReadWebSocketForEvents(CancellationToken cancelToken, Action notifyConnectionBroken) { var buffer = new ArraySegment <byte>(new byte[8192]); var stream = new MemoryStream(8192); while (!cancelToken.IsCancellationRequested) { stream.Seek(0, SeekOrigin.Begin); WebSocketReceiveResult result = null; do { try { result = await webSocket.ReceiveAsync(buffer, cancelToken); } catch (Exception) { var t = CloseSocket(); // no need to wait for completion if (!cancelToken.IsCancellationRequested) { notifyConnectionBroken(); } listener.OnConnectionClosed(); return; } stream.Write(buffer.Array, buffer.Offset, result.Count); }while (!result.EndOfMessage); stream.Seek(0, SeekOrigin.Begin); if (result.MessageType == WebSocketMessageType.Text) { using (var reader = new StreamReader(stream, Encoding.UTF8, false, 1024, leaveOpen: true)) { JObject eventObj = StdJson.JObjectFromReader(reader); try { DispatchEvent(eventObj); } catch (Exception exp) { Exception exception = exp.GetBaseException() ?? exp; Console.Error.WriteLine("Exception in event dispatch: " + exception.Message); } } } else if (result.MessageType == WebSocketMessageType.Close) { await CloseSocket(); if (!cancelToken.IsCancellationRequested) { notifyConnectionBroken(); } listener.OnConnectionClosed(); return; } } }