public async Task Disconnect(string reason, bool onDisconnectCommand)
        {
            ClientWebSocketHandler sender = this;

            try
            {
                if (ClientWebSocketHandler._webSocket != null)
                {
                    if (ClientWebSocketHandler._webSocket.State != WebSocketState.Open)
                    {
                        if (ClientWebSocketHandler._webSocket.State != WebSocketState.Connecting)
                        {
                            goto label_7;
                        }
                    }
                    await ClientWebSocketHandler._webSocket.CloseOutputAsync(WebSocketCloseStatus.Empty, reason, CancellationToken.None);
                }
            }
            catch (ObjectDisposedException ex)
            {
                Debug.Print(ex.Message);
            }
label_7:
            if (sender.Disconnected == null)
            {
                return;
            }
            await sender.Disconnected(sender, onDisconnectCommand);
        }
        public async Task Connect(
            string uri,
            string token,
            List <KeyValuePair <string, string> > headers = null)
        {
            ClientWebSocketHandler sender = this;

            try
            {
                if (ClientWebSocketHandler._webSocket.State == WebSocketState.Closed || ClientWebSocketHandler._webSocket.State == WebSocketState.Aborted)
                {
                    ClientWebSocketHandler._webSocket.Dispose();
                    ClientWebSocketHandler._webSocket = new ClientWebSocket();
                }
                if (ClientWebSocketHandler._webSocket.State == WebSocketState.None)
                {
                    ClientWebSocketHandler._webSocket.Options.SetRequestHeader("Authorization", "Bearer " + token);
                    if (headers != null)
                    {
                        foreach (KeyValuePair <string, string> header in headers)
                        {
                            ClientWebSocketHandler._webSocket.Options.SetRequestHeader(header.Key, header.Value);
                        }
                    }
                }
                await ClientWebSocketHandler._webSocket.ConnectAsync(new Uri(uri), CancellationToken.None);

                if (ClientWebSocketHandler._webSocket.State == WebSocketState.Open)
                {
                    if (sender.Connected != null)
                    {
                        await sender.Connected(sender);
                    }
                    Debug.Print("WebSocket connected");
                }
                await Task.WhenAll(sender.Receive(ClientWebSocketHandler._webSocket), sender.Send(ClientWebSocketHandler._webSocket));
            }
            catch (Exception ex)
            {
                Console.WriteLine("Exception: {0}", (object)ex);
                sender.OnError(sender, ex);
            }
            finally
            {
                Console.WriteLine("WebSocket closed.");
            }
        }
        private async Task Receive(ClientWebSocket webSocket)
        {
            ClientWebSocketHandler webSocketHandler = this;
            ArraySegment <byte>    inputSegment     = new ArraySegment <byte>(new byte[65536]);

            using (MemoryStream ms = new MemoryStream())
            {
                while (webSocket.State == WebSocketState.Open)
                {
                    try
                    {
                        WebSocketReceiveResult async = await webSocket.ReceiveAsync(inputSegment, CancellationToken.None);

                        if (async.MessageType == WebSocketMessageType.Close)
                        {
                            try
                            {
                                if (webSocketHandler.Disconnected != null)
                                {
                                    await webSocketHandler.Disconnected(webSocketHandler, true);
                                }
                                await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Endpoint demanded closure", CancellationToken.None);

                                Console.WriteLine("Endpoint demanded closure");
                                break;
                            }
                            catch
                            {
                                break;
                            }
                        }
                        else
                        {
                            ms.Write(inputSegment.Array, inputSegment.Offset, async.Count);
                            if (async.EndOfMessage)
                            {
                                ms.GetBuffer();
                                ms.Seek(0L, SeekOrigin.Begin);
                                WebSocketMessage message = WebSocketMessage.ReadFrom(true, (Stream)ms);
                                Console.WriteLine("Message:" + (object)ms.Length + " " + (object)message);
                                if (webSocketHandler.MessageReceived != null)
                                {
                                    webSocketHandler.MessageReceived(message, webSocketHandler);
                                }
                                ms.Seek(0L, SeekOrigin.Begin);
                            }
                        }
                    }
                    catch (WebSocketException ex)
                    {
                        if (webSocketHandler.Disconnected == null)
                        {
                            break;
                        }
                        await webSocketHandler.Disconnected(webSocketHandler, false);

                        break;
                    }
                }
            }
        }
 private Task ClientWebSocketConnected(ClientWebSocketHandler sender)
 {
     this.SendCursorMessage();
     return((Task)Task.FromResult <int>(0));
 }