private async Task ClosePrivateAsync(WebSocketCloseStatus status, String description) { try { if (State == WebSocketState.Closing) { // Close payload is two bytes containing the close status followed by a UTF8-encoding of the status description, if it exists. using (var buffer = new WebSocketSendBuffer()) { WriteCloseMessage(status, m_closeReceived ? String.Empty : description, buffer); await SendAsync(buffer.ToMessage(WebSocketMessageType.Close, this)); } var receiveCloseTask = Task.CompletedTask; lock ( m_lock ) { if (!m_closeReceived) { receiveCloseTask = ReceiveCloseAsync(); } } await receiveCloseTask; lock ( m_lock ) { if (State == WebSocketState.Closing) { ChangeState(WebSocketState.Closed); } } } } catch (Exception ex) { Abort(ex); } }
public async Task <Boolean> SendAsync(WebSocketMessageType messageType, WebSocketSendBuffer buffer) { if (buffer == null) { throw new ArgumentNullException(nameof(buffer)); } try { await SendAsync(buffer.ToMessage(messageType, this)); return(true); } catch (Exception ex) { WebSocketsEventSource.Log.Error(Id, ex); OnException?.Invoke(ex); Abort(ex.Message); return(false); } }