static async Task <bool> connectAsync(string uri, CancellationToken token, Action <WebSocketWrapper> onConnection, Action <ClientWebSocketOptions> setOptions = null) { ClientWebSocket webSocket = null; var isClosedSuccessfully = true; try { webSocket = new ClientWebSocket(); setOptions?.Invoke(webSocket.Options); await webSocket.ConnectAsync(new Uri(uri), token); } catch (Exception) { webSocket?.Dispose(); throw; } var connection = new WebSocketWrapper(webSocket, CookieUtils.GetCookies(webSocket.Options.Cookies?.GetCookies(new Uri(uri)))); try { onConnection(connection); await connection.ListenReceiveAsync(token); } finally { isClosedSuccessfully = webSocket.State != WebSocketState.Aborted; webSocket?.Dispose(); } return(isClosedSuccessfully); }