/// <summary> /// Listening thread function. /// </summary> private void ListenThread() { recvToken = new CancellationTokenSource(); byte[] buffer = new byte[_recvBufferSize]; ArraySegment <byte> bufferSegment = new ArraySegment <byte>(buffer); bool close = false; Message m = new Message(); try { while (IsConnected()) { Task <WebSocketReceiveResult> recvTask = null; lock (recvLock) { recvTask = socket.ReceiveAsync(bufferSegment, recvToken.Token); recvTask.Wait(recvToken.Token); } WebSocketReceiveResult recvResult = recvTask.Result; if (recvResult != null) { switch (recvResult.MessageType) { case WebSocketMessageType.Binary: log.Warn("Received unknown binary websocket message."); break; case WebSocketMessageType.Text: m.Append(buffer, recvResult.Count); break; case WebSocketMessageType.Close: close = true; break; } if (close) { break; } if (recvResult.EndOfMessage) { if (!m.Empty) { reconnectionAttempts = 0; HandleMessage(m); } m.Delete(); } } } } catch (Exception ex) { HandleListenerException(ex); } if (recvToken != null) { recvToken.Dispose(); recvToken = null; } if (!close && IsConnected()) { CloseInternal(); } else if (OnDisconnect != null) { StopSchedulers(); SocketDisconnectArgs dea = new SocketDisconnectArgs(disconnectInitiated, reconnectionAttempts); try { OnDisconnect.BeginInvoke(this, dea, OnDisconnectCallback, null); } catch (Exception odEr) { log.Error(odEr, "Error in OnDisconnect event."); } } else { disconnectInitiated = false; } }