private async Task <CallResult <UpdateSubscription> > Subscribe <T>(HuobiRequest request, Action <T> onData) where T : class
        {
            var connectResult = await CreateAndConnectSocket(request.Signed, true, onData).ConfigureAwait(false);

            if (!connectResult.Success)
            {
                return(new CallResult <UpdateSubscription>(null, connectResult.Error));
            }

            var subscription = connectResult.Data;

            Send(subscription.Socket, request);

            var subResult = await subscription.WaitForEvent(SubscriptionEvent, socketResponseTimeout).ConfigureAwait(false);

            if (!subResult.Success)
            {
                await subscription.Close().ConfigureAwait(false);

                return(new CallResult <UpdateSubscription>(null, subResult.Error));
            }

            subscription.Request = request;
            subscription.Socket.ShouldReconnect = true;
            return(new CallResult <UpdateSubscription>(new UpdateSubscription(subscription), null));
        }
        private async Task <CallResult <T> > Query <T>(HuobiRequest request) where T : HuobiResponse
        {
            CallResult <T> result       = null;
            var            subscription = GetBackgroundSocket(request.Signed);

            if (subscription == null)
            {
                // We don't have a background socket to query, create a new one
                var connectResult = await CreateAndConnectSocket <T>(request.Signed, false, data => result = new CallResult <T>(data, null)).ConfigureAwait(false);

                if (!connectResult.Success)
                {
                    return(new CallResult <T>(null, connectResult.Error));
                }

                subscription      = connectResult.Data;
                subscription.Type = request.Signed ? SocketType.BackgroundAuthenticated : SocketType.Background;
            }
            else
            {
                // Use earlier created background socket to query without having to connect again
                subscription.Events.Single(s => s.Name == DataEvent).Reset();
                if (request.Signed)
                {
                    subscription.MessageHandlers[DataHandlerName] = (subs, data) => DataHandlerV2 <T>(subs, data, rdata => result = new CallResult <T>(rdata, null));
                }
                else
                {
                    subscription.MessageHandlers[DataHandlerName] = (subs, data) => DataHandlerV1 <T>(subs, data, rdata => result = new CallResult <T>(rdata, null));
                }
            }

            Send(subscription.Socket, request);
            var dataResult = await subscription.WaitForEvent(DataEvent, socketResponseTimeout).ConfigureAwait(false);

            if (!dataResult.Success)
            {
                return(new CallResult <T>(null, dataResult.Error));
            }

            return(!result.Data.IsSuccessful ? new CallResult <T>(null, new ServerError($"{result.Data.ErrorCode}: {result.Data.ErrorMessage}")) : result);
        }