private void Listen() { while (!dispose) { var buffers = new List <byte[]>(); WebSocketReceiveResult msgInfo = null; try { while (!msgInfo?.EndOfMessage ?? true) { var b = new ArraySegment <byte>(new byte[bufferSize]); msgInfo = socket.ReceiveAsync(b, socketTokenSource.Token).Result; var bArray = b.Array; Array.Resize(ref bArray, msgInfo.Count); buffers.Add(bArray); } } catch (AggregateException ex) when(ex.InnerException?.GetType() == typeof(TaskCanceledException)) { OnClose.InvokeAsync(); return; } catch (Exception e1) { OnError?.Invoke(e1); if (!AutoReconnect) { return; } try { socketTokenSource.Token.WaitHandle.WaitOne(1000); ConnectAsync().Wait(); } catch (Exception e2) { OnReconnectFailed.InvokeAsync(); OnError.InvokeAsync(e2); OnClose.InvokeAsync(); } return; } var buffer = new List <byte>(); foreach (var b in buffers) { buffer.AddRange(b); } Task.Run(() => HandleNewMessage(msgInfo, buffer.ToArray())); } OnClose.InvokeAsync(); }